构造函数不提供签名new的匹配项

  • 本文关键字:new 构造函数 typescript
  • 更新时间 :
  • 英文 :


我有一个"汇编;这种情况下的问题:

interface IDataObjectConstructor {
new (objJSON?: any): myDataObject;
}
class myDataObject implements IDataObjectConstructor {
constructor(objJSON: any = null) {
for (var prop in objJSON) {
this[prop] = objJSON[prop];
}
}
}

上面写着:

类"myDataObject"错误地实现了接口"IDataObjectConstructor"。

类型"myDataObject"不提供签名"new(objJSON?:any):myDataObject"的匹配项

最后我想像这样使用这个对象:

class viewModelList<T extends myDataObject>{
item: T;
constructor(itemType: T) { this.item = itemType; }
itemBuilder(json?) { return new this.item(json); }
}
class derivedDataObject extends myDataObject{
constructor(objJSON: any = null) { super(objJSON); }
}
class derivedViewModelList extends viewModelList<derivedDataObject>{
constructor() { super(derivedDataObject); }
}
let oManager = new derivedViewModelList();

类的静态端和实例端之间的差异

在处理类和接口时,请记住类有两种类型:静态端的类型和实例端的类型。您可能会注意到,如果您创建了一个具有构造签名的接口,并试图创建一个实现该接口的类,则会出现错误:

interface ClockConstructor {
new (hour: number, minute: number);
}
class Clock implements ClockConstructor { // error
constructor(h: number, m: number) { } 
}

这是因为当一个类实现接口时,只检查该类的实例端。由于构造函数位于静态端,因此它不包含在该检查中。

相反,您需要直接处理类的静态端。在本例中,我们定义了两个接口ClockConstructor用于构造函数ClockInterface用于实例方法。然后为了方便起见,我们定义了一个构造函数createClock,它创建传递给它的类型的实例

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是否具有正确的构造函数签名。

有关详细信息,请参阅文档。

您不需要类来实现构造函数接口,这是自动发生的。

例如:

interface IDataObjectConstructor {
new (objJSON?: any): myDataObject;
}
class myDataObject {
constructor(objJSON: any = null) {
for (var prop in objJSON) {
this[prop] = objJSON[prop];
}
}
}
function factory(ctor: IDataObjectConstructor) {
return new ctor();
}
let o = factory(myDataObject);

(操场代码)

factory函数需要一个IDataObjectConstructor,我们传递类本身,即使您的类没有声明要实现它,也不会出现任何编译错误。

最新更新