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
为什么?我错过了什么吗?
答案 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签名。