typescript interface和class同名

为什么下面代码没有问题?

interface Animal {
    name:string;
}
interface Cat extends Animal{
    scratch:Function;
    bark:Function;
}
interface ShortHair extends Cat{}
class ShortHair implements Cat{}

shortHair类并没有实现接口的属性和方法,但是因为interface和class同名,导致没有报错,这是为什么?

阅读 6.9k
2 个回答

同名interface会自动聚合,也可以和已有的同名class聚合,适合做polyfil

以下所说有些是猜测的,仅供参考。

首先需要知道定义一个class的时候实际上也定义了一个同名的interface,比如可以这样使用:

class ShortHair {
    name: string = 'short_hair';
}

class FatShortHair implements ShortHair { // ShortHair可以作为interface使用
    // ..
}

我猜测class <Class> implements <Interface>语法要求的是名为<Class>的interface需要和<Interface>类型相同。

因为你主动定义了同名的ShortHairinterface,和作为class的ShortHair所生成的空对象interface合并后确实符合implements的规则,所以没有错误提示。

你可以这样写

interface ShortHair {
    name: string;
}
class ShortHair implements Cat {}

会发现错误提示是,缺少scratch/bark的实现。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题