interface - 如何转换为对象可能实现的接口(interface)?

标签 interface typescript

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

相关文章:

Java接口(interface)继承导致IDE困惑

interface - Go:从嵌入式结构覆盖接口(interface)方法

javascript - 当我从使用服务获取的数组中删除一个元素时,它在哪里被删除?

javascript - 向 es6 子类添加方法

typescript - 为什么我在 Cypress 中收到错误 `TypeError: fs.readdir is not a function`

model-view-controller - 使用接口(interface)排除模型绑定(bind)的属性

go - 使用接受 io.Writer 作为 HandleFunc 的函数

IDE 的 Android Studio 图形错误 - 双 View

javascript - typescript - 从日期中获取日期名称

node.js - 如何在 typescript 中导入 recursive-readdir