为什么在重写接口时TypeScript不会发出警告

时间:2014-04-26 00:14:30

标签: typescript

interface ClockInterface {
    setTime(d: Date);
}

class Clock implements ClockInterface  {
    // I would expect this to raise a compile error 
    // as it's not implementing the interface
    setTime(d) {
        // some logic that needs an instance of Date
    }
}

var cc = new Clock();

// otherwise it allows you to do any bad stuff you want.
cc.setTime(234);
cc.setTime('234');
cc.setTime([]);

当然,将setTime(d) {更改为setTime(d: Date) {会导致在setTime的最后3次调用中引发警告。

更简单的例子就是:

class Clock implements ClockInterface  {
    setTime() {
        // some logic that needs an instance of Date
    }
}

1 个答案:

答案 0 :(得分:2)

Liskov Substitution Principle。对于接口,该类是可替换的,因此它implement它。

当你说implements是"时,TypeScript执行的唯一检查是可分配给指定接口的类吗?"。考虑这种情况:

interface CatVeterinarian {
    checkup(a: Cat): void;
}

interface HumanDoctor {
    checkup(a: Human): void;
}

class UniversalDoctor implements CatVeterinarian, HumanDoctor {
    checkup(a: Animal) {
        // ...
    }
}

预设一分钟 错误:你会如何解决?您的UniversalDoctor课程实际上可以同时充当CatVeterinarianHumanDoctor。你没有什么可做的。

您可以使用非Clock参数调用Date这一事实只代表额外的功能 - 接受任意setTime个参数的能力。显然,编译器说'#34;你的类太多,它不满足那个接口*是荒谬的;几乎每个界面的实现者都会有一些额外的东西'这不是原始界面的一部分。