gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:41:25 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com