这个问题是直接类比使用 TypeScript 检查类类型 https://stackoverflow.com/questions/12789231/class-type-check-with-typescript
我需要在运行时查明任何类型的变量是否实现接口。这是我的代码:
interface A{
member:string;
}
var a:any={member:"foobar"};
if(a instanceof A) alert(a.member);
如果您在打字稿游乐场中输入此代码,最后一行将被标记为错误,“名称 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
。我该如何使用它?
您无需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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)