使用 Typescript 检查接口类型很多会员

2022-08-29 23:02:46

这个问题是直接类比类类型检查与 TypeScript

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

interface A{
    member:string;
}

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

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

如果在打字脚本 playground 中输入此代码,则最后一行将被标记为错误,“名称 A 在当前作用域中不存在”。但事实并非如此,该名称确实存在于当前范围内。我甚至可以将变量声明更改为没有编辑器的投诉。在浏览网页并找到有关SO的另一个问题后,我将界面更改为类,但随后我无法使用对象文本来创建实例。var a:A={member:"foobar"};

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

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

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

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

打字脚本游乐场的自动完成功能表明,打字脚本甚至提供了一种方法 。我该如何使用它?implements


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

答案 2

在 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