网站搜索

Typescript:类实现接口的问题?


在 Typescript 2.5.2 中,以下内容不起作用:

interface I {
    m?():void;
}

class C implements I {
}

let c = new C();
c.m();  <== Error : TS2339:Property 'm' does not exist on type 'C'.

为什么找不到 m 方法?

如果我加上:

interface C extends I {}

没关系!或者如果我加上:

let c = new C() as C & I;

也可以。

据我理解,implements 应该将 C 和 I 类型组合为 C & I。这有问题吗?

答案#1

你拥有的接口是一个弱类型,它不会在实现者上强制要求属性m。

TypeScript 足够聪明,可以看出 m 肯定不在你的类上,但你可以通过要求 TypeScript 将该变量视为接口来防止错误:

let c: I = new C();
c.m();

尽管有这个技巧,你仍然会遇到运行时问题,TypeScript 曾试图提醒你这一点。