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

typescript: instanceof not working with immutable.js types

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

的以下问题

以前只使用 if(x instanceof Immutable.Iterable) 意味着在 if 块中 x 的类型是 Immutable.Iterable<any, any>。但是,更新 typescript 后,推断的 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() 不提供我们需要的类型支持(因为变量仍然是类型 any).

创建类型保护:

const isIterable = (argument: any): argument is Iterable<any> =>
  Symbol.iterator in argument

用法:

declare const foo: number | Iterable<number>;

if (isIterable(foo)) {
  console.log(...foo);
}

The version of immutable I have installed is 4.0.0-rc.12. It doesn't expose a class called Iterable. Instead, it relies on the Iterable interface built-in the standard JavaScript library.