我用构造函数定义了通用接口,然后实现了该接口,但出现错误“ TS2420类型重置器没有为签名new (defaultValue: (...args: any[]) => T): IResetter<T>
提供匹配项”
interface IResetter<T> {
new (defaultValue: (...args: any[]) => T): IResetter<T>;
get (): T;
set (customValue: T);
reset ();
}
class Resetter<T> implements IResetter<T> {
private customValue: T = null;
constructor (private defaultValue: (...args: any[]) => T) { }
public get () {
return this.customValue || this.defaultValue(arguments);
}
public set (customValue) {
this.customValue = customValue;
}
public reset () {
this.customValue = null;
}
}
我不明白我做错了什么。
答案 0 :(得分:1)
构造函数签名不是类实例类型的一部分,它是类的“静态”部分的一部分。您不能通过实现接口来强制类实现特定的构造函数。您可以为类的静态端创建一个接口,当将类分配给该接口时,将出现错误:
interface IResetter<T> {
get (): T;
set (customValue: T): void;
reset (): void;
}
interface IResetterConstructor {
new <T>(defaultValue: (...args: any[]) => T): IResetter<T>;
}
class Resetter<T> implements IResetter<T> {
private customValue: T | null = null;
constructor (private defaultValue: (...args: any[]) => T) { }
public get () {
return this.customValue || this.defaultValue(arguments);
}
public set (customValue: T) {
this.customValue = customValue;
}
public reset () {
this.customValue = null;
}
}
function createNumberResetter(ctor: IResetterConstructor) {
return new ctor(() => 1);
}
createNumberResetter(Resetter) //ok
createNumberResetter(class { }) //err ctor not ok