接口中的TypeScript构造函数

时间:2016-09-22 10:51:03

标签: typescript

typescript doc说明了以下代码:

interface ClockConstructor {
    new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
    tick();
}

function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
    return new ctor(hour, minute);
}

class DigitalClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("beep beep");
    }
}
class AnalogClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("tick tock");
    }
}

let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);

...

  

因为createClock的第一个参数是ClockConstructor类型,所以   createClock(AnalogClock,7,32),它检查AnalogClock有   正确的构造函数签名。

但是,编译相同的代码而不使用构造函数,不会抛出错误,就像您可以看到here

为什么?我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

在ts类中没有构造函数仍然会在已编译的js中创建一个:

class DigitalClock implements ClockInterface {
    tick() {
        console.log("beep beep");
    }
}

编译成:

var DigitalClock = (function () {
    function DigitalClock() {
    }
    DigitalClock.prototype.tick = function () {
        console.log("beep beep");
    };
    return DigitalClock;
}());

所以那里有一个没有接收任何参数的构造函数,但在javascript中你仍然可以调用一个不用参数声明任何参数的函数:

function fn() {
    console.log(arguments);
}
fn(1, 2, 3); // [1, 2, 3]

但是在这种情况下,typescript会抱怨用参数调用fn 但这没关系:

type MyFunction = { (a: number, b: number, c: number): void }

(fn as MyFunction)(1, 2, 3);

我想编译器只是相信你知道你在做什么,因为ctor存在,你实际上可以从arguments对象中获取这些参数。

这怎么会失败:

class AnalogClock implements ClockInterface {
    constructor(str: string) {}
    tick() {
        console.log("tick tock");
    }
}
let analog = createClock(AnalogClock, 7, 32);

因为现在有一个不同的ctor签名。