当前位置: 首页 > 知识库问答 >
问题:

为什么TypeScript中的“instanceof”会给我一个错误“'foo'只引用类型,但在这里被用作值”?

农英杰
2023-03-14

我写了这段代码

interface Foo {
    abcdef: number;
}

let x: Foo | string;

if (x instanceof Foo) {
    // ...
}
'Foo' only refers to a type, but is being used as a value here.

共有1个答案

柯清野
2023-03-14

instanceOf使用类,而不是接口。

问题在于instanceof是来自JavaScript的构造,而在JavaScript中,instanceof需要右侧操作数的值。具体来说,在x instanceof foo中,JavaScript将执行运行时检查,以查看foo.prototype是否存在于x的原型链中的任何位置。

但是,在TypeScript中,接口没有发出。这意味着foofoo.prototype在运行时都不存在,因此这段代码肯定会失败。

您可能想从接口切换到,但您应该意识到,在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;

在本例中,您有XY,它们具有相同的类型,但是如果您尝试在其中一个上使用instanceof,您将在另一个上得到相反的结果。因此,instanceOf不会真正告诉您关于类型的很多信息,如果您正在利用typescript中的结构类型的话。

 类似资料: