gpt4 book ai didi

immutable.js - 如何用 Flow 描述 Immutable.js map 形状

转载 作者:行者123 更新时间:2023-12-03 07:21:04 27 4
gpt4 key购买 nike

我想使用 Immutable 的流类型定义来描述 map 的形状。

您可以通过以下方式描述物体的形状:

const stateShape: {
id: number,
isActive: boolean
} = {
id: 123,
isActive: true
};

Immutable 的 Maps 有类似的东西吗?

最佳答案

TL;DR;

不,但是使用 Records,您可以让 Flow 对形状进行类型检查,但不能对类型进行类型检查。

长篇

正确的答案是:不,因为 map 没有形状(至少在 Flow 和 Immutable 中)。但是不可变确实有一个带有形状的“ map ”类型。那就是记录。但由于下面描述的原因(因为它不严格相关)Immutable.Record 的流 libdef非常松散,实际上不检查形状。

更好的记录 libdef

如果我们忽略直接访问 Record 属性的(可以说是不必要的)功能,我们可以创建一个更好的 libdef。看起来像这样:

declare class Record<T: Object> {
static <T: Object>(spec: T, name?: string): Record<T>;
get: <A>(key: $Keys<T>) => A;
set<A>(key: $Keys<T>, value: A): Record<T>;
remove(key: $Keys<T>): Record<T>;
}

通过这个声明,我们可以定义记录的形状Here it is in action 。但我们仍然无法定义实际值的类型。 Flow 确实定义了一个未记录的 $PropertyType<T, K>类型。它需要一个对象 T和字符串文字 K 。使$PropertyType在我们的例子中,它需要适用于 $Keys<T>这是一个字符串联合类型。几周前,为了实现这一目标,提出了一个问题。 It can be found here .

map 和对象之间的区别

在流程上,它们是相当不同的。这是一张 map :

type MyMaps = { [key: string]: number }

实际的 key 未知。 Flow 唯一知道的是,所有键都必须是字符串,所有值都必须是数字。另一方面,对象类型看起来像:

type MyObject = { a: string, x: boolean }

创建或更改对象时,newObj ,类型为MyObject Flow,将检查newObj.a是一个字符串并且 newObj.x是一个 bool 值。

为什么当前的定义如此宽松

记录通过直接键访问公开每个键/值对。

type R = { a: string }
const r = Record({ a: 'Supa' })
r.a === r.get('a')

这需要 r 的类型定义是 Record<R> 的交集和R (不完全是,但足够接近)。所以:

(r: R & Record<R>)

这不起作用,因为 Flow 缺乏对与对象相交类型的支持。 Here's how that looks in action .

关于immutable.js - 如何用 Flow 描述 Immutable.js map 形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37033339/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com