带有 Typescript 的不可变 JS:创建 Map / OrderedMap 时"No overload matches this call"



我使用的是带有immutable@4.0.0-rc.12的Typescript版本3.8.3

当我使用二维数组创建OrderedMap来实例化它时,我从Typescript中得到了错误。

let v: OrderedMap<number, string> = OrderedMap([ [ 3, '2' ] ])

Codesandbox.io 示例

似乎库的定义文件可能是错误的?(immutable-nonambient.d.ts(1421, 39)(。这就是它给我的错误:

No overload matches this call.
Overload 1 of 4, '(collection: Iterable<[string | number, string | number]>): OrderedMap<string | number, string | number>', gave the following error.
Argument of type '(string | number)[][]' is not assignable to parameter of type 'Iterable<[string | number, string | number]>'.
The types returned by '[Symbol.iterator]().next(...)' are incompatible between these types.
Type 'IteratorResult<(string | number)[], any>' is not assignable to type 'IteratorResult<[string | number, string | number], any>'.
Type 'IteratorYieldResult<(string | number)[]>' is not assignable to type 'IteratorResult<[string | number, string | number], any>'.
Type 'IteratorYieldResult<(string | number)[]>' is not assignable to type 'IteratorYieldResult<[string | number, string | number]>'.
Type '(string | number)[]' is missing the following properties from type '[string | number, string | number]': 0, 1
Overload 2 of 4, '(obj: { [key: string]: string; }): OrderedMap<string, string>', gave the following error.
Type '(string | number)[]' is not assignable to type 'string'.ts(2769)
immutable-nonambient.d.ts(1421, 39): The expected type comes from this index signature.

我对Map也有同样的看法。如果我创建空的MapOrderedMap并将其分配给变量,我可以在没有错误的情况下对数据执行操作,因此它在以这种方式初始化时会遇到问题。

使用此签名进行实例化:OrderedMap({ 3: '2' })在没有编译错误的情况下工作。但很明显,我不能使用它,因为我希望我的密钥是数字,而使用数组表示法是实现它的唯一方法

首先,@types/immutable不再支持

此包已被弃用

作者信息:

这是Facebook的Immutable的存根类型定义(https://github.com/facebook/immutable-js)。Facebook的Immutable提供了自己的类型定义,所以你不需要安装@types/Immutable!

删除它之后,您应该会在编辑器中得到不错的类型提示。

工作示例:https://stackblitz.com/edit/typescript-vwetmv?file=index.ts

更新

在编译器选项中添加"target": "es2015"将删除该错误。

请参阅文档:将TypeScript与Immutable.js v4 一起使用

Immutable.js类型定义包含ES2015。虽然Immutable.js本身支持遗留浏览器和环境,但其类型定义需要TypeScript的2015 lib。在tsconfig.json中包含"target": "es2015""lib": "es2015",或将--target es2015--lib es2015提供给tsc命令。

最新更新