使用Typescript进行接口类型检查
这个问题是使用TypeScript进行类类型检查的直接类比
我需要在运行时找出类型为any的变量是否实现了接口。这是我的代码:
interface A{ member:string;
}
var a:any={member:"foobar"};
if(a instanceof A) alert(a.member);
如果在打字机游乐场输入此代码,则最后一行将被标记为错误,“名称A在当前作用域中不存在”。但这不是事实,该名称确实存在于当前范围内。我什至可以将变量声明更改为vara:A={member:"foobar"};
无编辑者的抱怨。浏览完网络并在SO上找到另一个问题后,我将接口更改为一个类,但是后来我无法使用对象文字来创建实例。
我想知道类型A如何会消失,但是查看生成的javascript可以解释问题:
var a = { member: "foobar"
};
if(a instanceof A) {
alert(a.member);
}
没有将A表示为接口,因此无法进行运行时类型检查。
我知道javascript作为一种动态语言没有接口的概念。有什么方法可以对接口进行类型检查吗?
打字稿操场的自动补全表明,打字稿甚至提供了一种方法implements
。如何使用?
回答:
您可以在不使用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);
}
以上是 使用Typescript进行接口类型检查 的全部内容, 来源链接: utcz.com/qa/421520.html