打字稿: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.
我们正在尝试将我们的项目从 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 is4.0.0-rc.12
. It doesn't expose a class calledIterable
. Instead, it relies on theIterable
interface built-in the standard JavaScript library.