instanceof
使用类,而不是接口。
这是怎么回事
问题是,instanceof
是从JavaScript构建,并在JavaScript中,instanceof
需要一个值的右侧操作数。具体而言,在x instanceof Foo
JavaScript的执行运行时检查,看是否Foo.prototype
在原型链中任何地方存在x
。
然而,在 TypeScript 中,interface
s 没有发射。这意味着在运行时既不存在Foo
也不Foo.prototype
存在,所以这段代码肯定会失败。
TypeScript 试图告诉你这永远行不通。Foo
只是一个类型,它根本不是一个值!
“我能做什么来代替instanceof
?”
您可以查看类型保护和用户定义的类型保护。
“但如果我只是从 an 切换interface
到 aclass
呢?”
您可能很想从 an 切换interface
到 a class
,但您应该意识到,在 TypeScript 的结构类型系统(其中事物主要基于形状)中,您可以生成与给定类具有相同形状的任何对象:
class C {
a: number = 10;
b: boolean = true;
c: string = "hello";
}
let x = new C()
let y = {
a: 10, b: true, c: "hello",
}
// Works!
x = y;
y = x;
在这种情况下,您有x
和y
具有相同的类型,但是如果您尝试instanceof
在其中一个上使用,您将在另一个上得到相反的结果。因此,如果您在 TypeScript 中利用结构类型,instanceof
则不会真正告诉您有关类型的太多信息。