使用 Typescript 进行接口类型检查

新手上路,请多包涵

这个问题直接类似于 使用 TypeScript 进行类类型检查

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

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 。我该如何使用它?

原文由 lhk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 831
2 个回答

您可以在没有 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);
 }

原文由 Fenton 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 TypeScript 1.6 中, 用户定义的类型保护 将完成这项工作。

 interface Foo {
    fooProperty: string;
}

interface Bar {
    barProperty: string;
}

function isFoo(object: any): object is Foo {
    return 'fooProperty' in object;
}

let object: Foo | Bar;

if (isFoo(object)) {
    // `object` has type `Foo`.
    object.fooProperty;
} else {
    // `object` has type `Bar`.
    object.barProperty;
}

正如 Joe Yang 提到的那样:自 TypeScript 2.0 以来,您甚至可以利用标记联合类型。

 interface Foo {
    type: 'foo';
    fooProperty: string;
}

interface Bar {
    type: 'bar';
    barProperty: number;
}

let object: Foo | Bar;

// You will see errors if `strictNullChecks` is enabled.
if (object.type === 'foo') {
    // object has type `Foo`.
    object.fooProperty;
} else {
    // object has type `Bar`.
    object.barProperty;
}

它也适用于 switch

原文由 vilicvane 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题