我对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
中找到答案 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);
}
}