在这种情况下,我遇到了“编译”问题:
interface IDataObjectConstructor {
new (objJSON?: any): myDataObject;
}
class myDataObject implements IDataObjectConstructor {
constructor(objJSON: any = null) {
for (var prop in objJSON) {
this[prop] = objJSON[prop];
}
}
}
Run Code Online (Sandbox Code Playgroud)
它说:
类“ 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();
Run Code Online (Sandbox Code Playgroud)
act*_*cay 10
在使用类和接口时,请记住一个类有两种类型:静态端的类型和实例端的类型。您可能会注意到,如果使用构造签名创建接口并尝试创建实现该接口的类,则会出现错误:
interface ClockConstructor {
new (hour: number, minute: number);
}
class Clock implements ClockConstructor { // error
constructor(h: number, m: number) { }
}
Run Code Online (Sandbox Code Playgroud)
这是因为当类实现接口时,仅检查类的实例侧。由于构造函数位于静态端,因此此检查中不包括该构造函数。
相反,您将需要直接使用类的静态方面。在此示例中,我们定义了两个接口,用于构造函数的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);
Run Code Online (Sandbox Code Playgroud)
由于中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);
Run Code Online (Sandbox Code Playgroud)
(操场上的代码)
该factory函数需要一个IDataObjectConstructor,并且我们正在传递类本身,即使您的类没有声明来实现它,您也不会收到任何编译错误。
| 归档时间: |
|
| 查看次数: |
6819 次 |
| 最近记录: |