Dan*_*ser 60 javascript instanceof typescript
我写了这段代码
interface Foo {
abcdef: number;
}
let x: Foo | string;
if (x instanceof Foo) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是TypeScript给了我这个错误:
'Foo' only refers to a type, but is being used as a value here.
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我认为instanceof
可以检查我的值是否具有给定类型,但TypeScript似乎不喜欢这样.
Dan*_*ser 68
问题是,instanceof
是从JavaScript构建,并在JavaScript中,instanceof
需要一个值的右侧操作数.具体来说,在x instanceof Foo
JavaScript中将执行运行时检查以查看是否Foo.prototype
存在于原型链中的任何位置x
.
但是,在TypeScript中,interface
s没有发射.这意味着在运行时既不存在Foo
也不Foo.prototype
存在,所以这段代码肯定会失败.
TypeScript试图告诉你这可能永远不会奏效.Foo
只是一种类型,它根本不是一个价值!
instanceof
?"您可以查看类型保护和用户定义的类型保护.
interface
到一个class
?"您可能想要从interface
a 切换到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;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,你有x
和y
那个类型相同,但是如果你尝试使用instanceof
任何一个,你将得到相反的结果.因此,如果您正在利用TypeScript中的结构类型,那么对于类型instanceof
将不会真正告诉您.
Lee*_*iam 11
如果您希望检查的接口具有不同的属性/功能,则在运行时使用接口进行类型检查是使用类型保护。
例子
let pet = getSmallPet();
if ((pet as Fish).swim) {
(pet as Fish).swim();
} else if ((pet as Bird).fly) {
(pet as Bird).fly();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
39059 次 |
最近记录: |