TypeScript。如何实现通用接口的构造函数

时间:2019-11-01 10:15:54

标签: 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;
    }

}

我不明白我做错了什么。

1 个答案:

答案 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 

Play

相关问题