我有以下类和接口(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/

10-10 07:40