An interface
TypeScript 中的 是仅编译时构造,没有运行时表示。您可能会发现 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();
}