Angular 检查对象的属性是否为特定类型 我对打字稿很陌生,而且在Typescript中遇到了一个简单的问题(我来自C++,所以泛型/模板不应该是一个需要理解的问题)。我在Typescript中不断地进行类型检查。我一直认为我理解它,但当我需要它的时候我就不理解了。我一直在搜索,但很多方法似乎都没有达到我想要的效果,因为我觉得这很具体
我有一个带有一些(可选)属性的通用接口。这些属性之一是泛型的类型(代码如下所示)。接下来是一个带有一些方法的通用角度服务。这些方法在其参数列表中使用该接口。现在,其中一个函数必须检查参数列表中接收的参数类型是否与角度服务的泛型类型完全相同 我不知道这一切是否有意义,但以下是我解释的,但在代码中:Angular 检查对象的属性是否为特定类型 我对打字稿很陌生,而且在Typescript中遇到了一个简单的问题(我来自C++,所以泛型/模板不应该是一个需要理解的问题)。我在Typescript中不断地进行类型检查。我一直认为我理解它,但当我需要它的时候我就不理解了。我一直在搜索,但很多方法似乎都没有达到我想要的效果,因为我觉得这很具体,angular,typescript,generics,types,Angular,Typescript,Generics,Types,我有一个带有一些(可选)属性的通用接口。这些属性之一是泛型的类型(代码如下所示)。接下来是一个带有一些方法的通用角度服务。这些方法在其参数列表中使用该接口。现在,其中一个函数必须检查参数列表中接收的参数类型是否与角度服务的泛型类型完全相同 我不知道这一切是否有意义,但以下是我解释的,但在代码中: interface MyInterface<T> { command: string; channel: string; data?: T; }; interfac
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;
};
接口MyClass{
url:string;
参数?:字符串[]
};
@可注射({…})
类MyService实现MyServiceParent{
...
匹配(对象:MyInterface):布尔值{
//检查obj是否为MyInterface类型
}
};
问题是,我可能能够在构建时检查这个问题,但是这个检查必须在运行时进行,因为MyInterface
的“T”可以是任何东西,即使MyService
的泛型是MyClass
。编译器/生成器无法检查其类型,因为传递到MyService::match
的数据将来自post消息(应用程序位于iframe中)。这意味着我可以发布一条消息,例如,一个字符串和类型脚本可以很好地编译,因为数据不是预定义的。这正是我需要在运行时检查类型的原因,因为此服务只能处理该特定类型(在本例中:MyInterface
)
我希望这是清楚的。如果有什么不清楚,请询问
谢谢你的时间
更新
这个问题的代码可以在下面的中找到。Typescript有一个名为kind的属性 它的价格比普通的便宜
interface MyInterface {
kind: "myObj";
}
function area(s: Obj) {
switch (s.kind) {
case "myObj": return ;
default :
throw NotCorrectObjException(Obj.kind);
}
}
Typescript有一个名为kind的属性 它的价格比普通的便宜
interface MyInterface {
kind: "myObj";
}
function area(s: Obj) {
switch (s.kind) {
case "myObj": return ;
default :
throw NotCorrectObjException(Obj.kind);
}
}
这回答了你的问题吗@这是否意味着我必须自己创建一个函数来检查它的类型?因为我希望有一个方法可以自己处理这个问题。看起来我可以用它来做我想做的事情,但我真的希望(现在仍然希望!)它有一个内置功能。
MyClass
似乎不是您示例代码中的一种类型,而且MyClass
值的指定不足以让人提出特定的解决方案。毫无疑问,您需要为您关心的任何特定类型编写自己的运行时测试;您可以将此测试注释为类型保护函数,以便编译器了解它的功能。这个问题的答案重复说明了如何做到这一点。如果您需要一些不同的东西,请编辑上面的代码以构成一个完整的示例,该示例准确地演示了您需要什么,以及为什么用户定义的类型保护不适合您。祝你好运@jcalz谢谢:)我已经更新了我的问题,所以它是可复制的。我希望任何人都能得到我想要的解决方案。同时,我将使用Max分享的答案。如果我没有找到其他解决方案,我将给出一个答案:)这是否回答了你的问题@这是否意味着我必须自己创建一个函数来检查它的类型?因为我希望有一个方法可以自己处理这个问题。看起来我可以用它来做我想做的事情,但我真的希望(现在仍然希望!)它有一个内置功能。MyClass
似乎不是您示例代码中的一种类型,而且MyClass
值的指定不足以让人提出特定的解决方案。毫无疑问,您需要为您关心的任何特定类型编写自己的运行时测试;您可以将此测试注释为类型保护函数,以便编译器了解它的功能。这个问题的答案重复说明了如何做到这一点。如果您需要一些不同的东西,请编辑上面的代码以构成一个完整的示例,该示例准确地演示了您需要什么,以及为什么用户定义的类型保护不适合您。祝你好运@jcalz谢谢:)我已经更新了我的问题,所以它是可复制的。我希望任何人都能得到我想要的解决方案。同时,我将只使用Max共享的答案。如果我没有找到其他解决方案,我将给出一个答案:)我不知道这个答案如何适用;除了名称MyInterface
之外,这里的代码似乎与问题代码没有明显的关联。您似乎建议问题使用a来区分类型,但这仅在您需要区分有限的类型列表时有效,您可以更改这些类型的定义以包含判别属性。如果这是或不是你想要表达的,如果你能更明确地解释它会有所帮助;除了名称MyInterface
之外,这里的代码似乎与问题代码没有明显的关联。您似乎建议问题使用a来区分类型,但这仅在您需要区分有限的类型列表时有效,您可以更改这些类型的定义以包含判别属性。如果这是或不是你想要表达的,如果你能更明确地解释它会有所帮助。