打字稿:instanceof不适用于immutable.js类型

时间:2019-01-24 10:41:32

标签: typescript immutable.js

我们正在尝试将我们的项目从typescript2.4更新为typescript3.2。我们偶然发现了immutable.js的以下问题。

以前,仅使用if(x instanceof Immutable.Iterable)意味着在if块中,x的类型为Immutable.Iterable<any, any>。但是,更新打字稿后,x的推断类型为{}

代码段

enter image description here

类型推断错误

enter image description here

使用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 }}。

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库中。