我有以下类和接口(interface):
export interface IBody {
body : ListBody;
}
export class Element {
// ...
}
export class Paragraph extends Element implements IBody {
// ...
}
export class Character extends Element {
// ...
}
我有一些代码,可以在其中获得元素派生对象的数组(不仅仅是段落和字符)。对于那些实现IBody的人员,我需要对体内的元素采取行动。
查看它是否实现IBody的最佳方法是什么?是“if(element.body!==未定义)”吗?
然后我该如何访问呢? “var bodyElement = 元素;”给我一个错误。
C:/src/jenova/Dev/Merge/AutoTagWeb/client/layout/document/elements/factory.ts(34,27): error TS2012: Cannot convert 'Element' to 'IBody':
Type 'Element' is missing property 'body' from type 'IBody'.
Type 'IBody' is missing property 'type' from type 'Element'.
谢谢-戴夫
最佳答案
TypeScript中的interface
是仅编译时的结构,没有运行时表示。您可能会发现TypeScript规范的第7节很有趣,因为它具有完整的详细信息。
因此,您不能专门“测试”一个interface
。正确而完整地完成后,通常不需要测试它,因为编译器应该已经发现了对象未实现必要接口(interface)的情况。如果要尝试使用类型断言:
// // where e has been typed as any, not an Element
var body = <IBody> e;
您已经断言类型是
IBody
,编译器将在没有警告的情况下允许它。但是,如果e
在范围内是Element
,则如您所示,编译器将检查Element
的签名并确认其具有IBody
声明的属性/方法。重要的是要注意,它正在检查签名-没关系,只要签名匹配,它就可以不实现IBody
。假设
Element
具有与IBody
匹配的签名,则它将起作用。如果没有,您将收到所收到的编译器错误。但是,同样,如果将其声明为any
,则声明将通过,并且在运行时,除非该类型具有在IBody
上定义的方法,否则脚本将失败。由于
Element
是基类,因此无法检查IBody
。您可以将参数声明为any
:function someFeature(e: any) {
}
然后断言
IBody
存在:function someFeature(e: any) {
var body :IBody = <IBody> e;
// do something
}
但是,如果确实需要运行时检查,则需要在
prototype
上查找该函数,或者在使用该函数之前将其作为属性。尽管在某些情况下可能会引起误解,但TypeScript中的interface
也可能未发现不匹配的情况。 Here是如何检查特定功能是否存在的示例。它可能看起来像这样:
function someFeature(e: any) {
var body = <IBody> e;
if (typeof (body.someFunctionOnBodyInterface) === "undefined") {
// not safe to use the function
throw new Error("Yikes!");
}
body.someFunctionOnBodyInterface();
}
关于interface - 如何将对象转换为可能实现的接口(interface)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23281962/