我有以下类和接口(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 !== undefined)”吗?
然后我该如何访问它? “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/