检查对象的属性是否为特定类型

时间:2020-03-02 20:26:15

标签: angular typescript generics types

我对Typescript还是很陌生,并且在Typescript中苦苦挣扎,这似乎是个简单的问题(我来自C ++,所以泛型/模板应该不是一个容易理解的问题)。我经常在Typescript中进行类型检查,这一直很麻烦。我一直以为我了解它,但是当我需要它时我就不知道。我一直在搜索,但是很多方法似乎并没有按照我想做的去做。

我有一个带有某些(可选)属性的通用接口。这些属性之一是通用类型(代码如下所示)。除此之外,我还有一些方法的通用Angular Service。这些方法在其参数列表中使用该接口。现在,这些功能之一必须检查参数列表中接收到的参数类型是否与Angular Service的通用类型完全相同。

我不知道这一切是否有意义,但这是我在代码中解释的内容:

interface MyInterface<T> {
    command: string;
    channel: string;
    data?: T;
};

interface MyClass {
   url: string;
   params?: string[]
};

@Injectable({...})
class MyService<T> implements MyServiceParent<T> {
    ...

    match(obj : MyInterface<T>): boolean {
       // check if obj is of type MyInterface<MyClass>
    }
};

问题是,我也许可以在构建时进行检查,但是此检查必须在运行时进行,因为MyInterface的'T'可以是任何值,即使MyService的泛型是{ {1}}。编译器/生成器无法检查其类型,因为传递到MyClass的数据将来自发布消息(应用程序位于iframe中)。这意味着我可以使用例如字符串发布消息,并且由于未预定义数据,因此Typescript可以正常编译。这正是为什么我需要在运行时检查类型的原因,因为该服务只能处理该特定类型(在这种情况下为MyService::match)。

我希望这很清楚。请询问是否不清楚。

感谢您的时间!

更新

此问题的代码游乐场可在以下Typescript playground

中找到

1 个答案:

答案 0 :(得分:0)

Typescript具有一个称为kind的属性。 Documentation

它比typeof便宜。

interface MyInterface {
   kind: "myObj";
}

function area(s: Obj) {
   switch (s.kind) {
       case "myObj": return ;
       default :
          throw NotCorrectObjException(Obj.kind);
   }
}