子类方法签名推断

时间:2019-05-29 11:35:18

标签: javascript typescript

我有以下抽象类

// AbstractFiller.ts
export abstract class AbstractFiller {
   public abstract fill(data: number | string | boolean | Date, numberOfFillers: number): string;
}

和几个填充子类

export class WhiteSpacesFiller extends AbstractFiller {
  public fill(data: number | string | boolean | Date, numberOfFillers: number): string {
    // logic
  }
}

export class ZerosFiller extends AbstractFiller {
  public fill(data: number | string | boolean | Date,  numberOfFillers: number): string {
    // logic
  }
}

// ...etc

TS是否有一种方法可以从抽象类中推断方法签名,以便获得:

  1. 每个子类中没有类型重复
  2. 严格签名实施,例如从子类的number类型中删除data不会引发错误。

2 个答案:

答案 0 :(得分:1)

Typescript不会从基类推断方法参数。它的工作方式是,在键入类之后,将检查该类与基类的兼容性。这意味着派生类中的参数可以是派生类型(虽然这听起来不合理,但即使在严格的null检查下,类方法参数也是双变量相关的。)

为减少类型重复的数量,可以做的一件事是将Parameters与剩余参数解构一起使用。

export abstract class AbstractFiller {
    public abstract fill(data: number | string | boolean | Date, numberOfFillers: number): string;
}

export class WhiteSpacesFiller extends AbstractFiller {
    public fill(...[data, numberOfFillers]: Parameters<AbstractFiller['fill']>): string {
        return ""
    }
}

答案 1 :(得分:0)

如果我误解了这个问题,请问我,但是我认为您可以使用泛型来解决您的问题,即让您的AbstractFiller类是泛型的。

这看起来像这样:

export abstract class AbstractFiller<T> {
    public abstract fill(data: T, numberOfFillers: number): string;
}

export class WhiteSpacesFiller extends AbstractFiller<string> {
    public fill(data: string, numberOfFillers: number) {
        //logic
        return data;
    }
} 

export class ZerosFiller extends AbstractFiller<number> {
    public fill(data: number, numberOfFillers: number) {
        return data.toString();
    }
}