小编典典

使用 Typescript 进行接口类型检查

all

我需要在运行时找出任何类型的变量是否实现了接口。这是我的代码:

interface A{
    member:string;
}

var a:any={member:"foobar"};

if(a instanceof A) alert(a.member);

如果在 typescript playground 中输入此代码,最后一行将被标记为错误,“当前范围内不存在名称
A”。但这不是真的,该名称确实存在于当前范围内。我什至可以将变量声明更改为var a:A={member:"foobar"};没有编辑器的投诉。在浏览网页并在 SO
上找到另一个问题后,我将接口更改为一个类,但后来我不能使用对象文字来创建实例。

我想知道 A 类型是如何消失的,但看看生成的 javascript 就可以解释这个问题:

var a = {
    member: "foobar"
};
if(a instanceof A) {
    alert(a.member);
}

没有将 A 表示为接口,因此无法进行运行时类型检查。

我知道 javascript 作为一种动态语言没有接口的概念。有什么方法可以对接口进行类型检查吗?

typescript playground 的自动补全显示 typescript 甚至提供了一个方法implements。我该如何使用它?


阅读 301

收藏
2022-03-14

共1个答案

小编典典

instanceof您可以在没有关键字的情况下实现您想要的,因为您现在可以编写自定义类型保护:

interface A{
    member:string;
}

function instanceOfA(object: any): object is A {
    return 'member' in object;
}

var a:any={member:"foobar"};

if (instanceOfA(a)) {
    alert(a.member);
}

很多会员

如果您需要检查大量成员以确定对象是否与您的类型匹配,则可以添加一个鉴别器。下面是最基本的示例,需要您管理自己的鉴别器......您需要更深入地了解模式以确保避免重复的鉴别器。

interface A{
    discriminator: 'I-AM-A';
    member:string;
}

function instanceOfA(object: any): object is A {
    return object.discriminator === 'I-AM-A';
}

var a:any = {discriminator: 'I-AM-A', member:"foobar"};

if (instanceOfA(a)) {
    alert(a.member);
}
2022-03-14