我们正在尝试将我们的项目从typescript2.4更新为typescript3.2。我们偶然发现了immutable.js的以下问题。
以前,仅使用if(x instanceof Immutable.Iterable)
意味着在if
块中,x
的类型为Immutable.Iterable<any, any>
。但是,更新打字稿后,x的推断类型为{}
。
代码段
类型推断错误
使用x as Immutable.Iterable<any, any>
来修复所有错误真是令人讨厌。
我想问题在于immutable.js,因为在if
块中可以正确推断出其他任何类型。
P.S。我知道以下事实:instanceof
并不总是值得信赖的(https://github.com/facebook/immutable-js/issues/450#issuecomment-107238770),但是使用Immutable.Iterable.isIterable()
并不能提供我们需要的类型支持(因为变量仍然是{{1 }}。
答案 0 :(得分:1)
创建类型保护:
const isIterable = (argument: any): argument is Iterable<any> =>
Symbol.iterator in argument
用法:
declare const foo: number | Iterable<number>;
if (isIterable(foo)) {
console.log(...foo);
}
我安装的
immutable
的版本是4.0.0-rc.12
。它 没有公开名为Iterable
的类。相反,它依赖于Iterable
接口内置在标准JavaScript库中。