TypeScript.如何实现泛型接口的构造函数



我用构造函数定义通用接口,然后实现它,但出现错误"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;
}
}

我不明白我做错了什么。

构造函数签名不是类实例类型的一部分,而是类的"static"端的一部分。不能通过实现接口来强制类实现特定的构造函数。你可以为类的静态端创建一个接口,当类被分配给该接口时,我们会出现一个错误:

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 

播放

最新更新