简述
instanceof
只适用于类,而不适用于接口和类型别名。
TypeScript 试图告诉我什么?
问题在于 instanceof
是 JavaScript 中的一个构造,而在 JavaScript 中,instanceof
需要右侧操作数传递一个 值。
具体来说,在 x instanceof Foo
中,JavaScript 将在原型链中检查是否存在 Foo.prototype
。
然而,在 TypeScript 中,interface
没有发出。同样适用于 type
别名。这意味着在运行时既不存在 Foo
也不存在 Foo.prototype
,因此此代码肯定会失败。
TypeScript 告诉你这永远不可能起作用。 Foo
只是一种类型,根本不是值!
如果您来自另一种语言,则可能希望在此处使用类。类确实会在运行时创建值,但您可能想阅读下面的一些注释。
"如果我仍然需要 type
或 interface
,除了 instanceof
,我该怎么办?"
您可以查看 type guards and user-defined type guards。
"但如果我只是从一个接口
切换到一个类
呢?"
你可能会想要从一个接口
切换到一个类
,但你应该意识到,在TypeScript的结构类型系统中(其中事物主要基于形状),你可以创建任何与给定类具有相同形状的对象:
class C {
a: number = 10;
b: boolean = true;
c: string = "hello";
}
let x = new C()
let y: C = {
a: 10, b: true, c: "hello",
}
x = y;
y = x;
在这种情况下,您有具有相同类型的“x”和“y”,但是如果尝试在任何一个上使用“instanceof”,则另一个会返回相反的结果。因此,如果利用 TypeScript 中的结构类型,那么“instanceof”实际上并不会告诉您有关类型的太多信息。
Foo | string
。 - Daniel Rosenwasser