首页 > 解决方案 > 打字稿。如何实现泛型接口的构造函数

问题描述

我用构造函数定义了通用接口,然后实现它但有一个错误'TS2420 Type Resetter provides no match for the signature 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;
    }

}

我不明白我做错了什么。

标签: typescript

解决方案


构造函数签名不是类实例类型的一部分,它是类的“静态”端的一部分。您不能通过实现接口来强制类实现特定的构造函数。您可以为类的静态端创建一个接口,当类分配给该接口时,我们将遇到错误:

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 


推荐阅读