想象一下,我们有一个接口,它定义了构造函数应该接受哪些参数:
interface Ctr {
new (num: number): any;
}
然后我们有一个带有默认构造函数的类:
class DefCtr {
}
然后,出于某种原因,我可以将DefCtrclass 分配给 type 的变量Ctr:
const Instance: Ctr = DefCtr;
const i = new Instance(1);
console.log(i);
// The output is:
// DefCtr {}
所以Instance是一个DefCtr类(它没有构造函数接受数字)。但是界面迫使我在创建它的实例时传递一个数字(将被忽略)。
有趣的是,这仅在类具有默认构造函数时才有效。例如,这不起作用:
interface Ctr {
new (num: number): any;
}
class NotDefCtr {
// Lets create a non-default constructor
constructor(str: string) {
}
}
const Instance: Ctr = NotDefCtr; // Error:
// Type 'typeof NotDefCtr' is not assignable to type 'Ctr'.
// Types of parameters 'str' and 'num' are incompatible.
// Type 'number' is not assignable to type 'string'.
错误是有道理的。但从我的角度来看,尝试使用默认构造函数分配一个类时收到错误也是有意义的(因为它没有任何其他构造函数匹配接口)。