这个问题是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"};,而不会收到编辑的抱怨.在浏览Web并找到另一个问题之后,我将接口更改为一个类,但是之后我不能使用对象文字来创建实例.

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

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

没有接口的表示形式,因此不可能进行运行时类型判断.

我知道javascript作为一种动态语言没有接口的概念.有没有办法对接口进行类型判断?

typescriptplayground 的自动完成功能显示,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);
}

Lots of Members

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

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);
}

Javascript相关问答推荐

使用useParams路由失败

如何按预期聚合SON数据?

主要内部的ExtJS多个子应用程序

禁用从vue.js 2中的循环创建的表的最后td的按钮

如何访问Json返回的ASP.NET Core 6中的导航图像属性

如何找出摆线表面上y与x相交的地方?

Angular:动画不启动

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

如何修复我的数据表,以使stateSave正常工作?

如何使用TypeScrip设置唯一属性?

在css中放置所需 colored颜色 以填充图像的透明区域

如何在JAVASCRIPT中合并两组对象并返回一些键

打字脚本中方括号符号属性访问和拾取实用程序的区别

是否可以将异步调用与useState(UnctionName)一起使用

将相关数据组合到两个不同的数组中

将Singleton实例设置为未定义后的Angular 变量引用持久性行为

从异步操作返回对象

JQuery使用选项填充HTMLSELECT并设置默认结果,默认结果显示为空

有角粘桌盒阴影

使用Java脚本筛选数组中最接近值最小的所有项