如何转换为对象可能实现的接口?

2024-02-23

我有以下类和接口:

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'.

谢谢-戴夫


An interfaceTypeScript 中的 是仅编译时构造,没有运行时表示。您可能会发现 TypeScript 规范的第 7 节读起来很有趣,因为它包含完整的详细信息。

所以,你不能“测试”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,脚本将会失败。

As your Element是基类,你cannot检查IBody。你可以将一个参数声明为any:

function someFeature(e: any) {

} 

然后断言IBody存在:

function someFeature(e: any) {
     var body :IBody = <IBody> e;    
     // do something
} 

但是,如果您确实需要运行时检查,则需要在prototype或在使用之前作为财产。虽然这在某些情况下可能会产生误导,interface在 TypeScript 中也可能没有捕获到不匹配的情况。Here https://stackoverflow.com/a/1042154/95190这是一个如何检查特定函数是否存在的示例。

它可能看起来像这样:

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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何转换为对象可能实现的接口? 的相关文章

随机推荐