網站搜尋

Typescript:重複的函數實作訊息


我在我的類別中創建了這兩個靜態工廠方法:

export class ConstantImpl<T> {
    public static create(b: Boolean): Constant<Boolean> {
        return new ConstantImpl<Boolean>(b);
    }

    public static create(i: Number): Constant<Number> {
        return new ConstantImpl<Number>(i);
    }
}

然而,我收到這個編譯錯誤訊息:

函數實現重複。

有什麼想法嗎?

答案#1

正如 @cartant 建議的,你可以在 TypeScript 中使用重載。它們有單一的實現但多個簽名。你可以在手冊中閱讀如何讓簽名和實現協同工作。在你的情況下,你可以這麼做:

export class ConstantImpl<T> {
  // guessing at your constructor
  public constructor(public val: T) {

  }

  public static create(b: boolean): Constant<boolean>;
  public static create(i: number): Constant<number>;
  public static create(v: boolean | number): Constant<boolean | number> {
        return new ConstantImpl(v);
    }
}

這只會允許 ConstantImpl.create() 接受 boolean 或 number 值,並且會拒絕其他所有值。請注意,我不需要檢查 v 的類型來判斷它是否為 boolean 或 number,也不需要在調用 ConstantImpl<T> 構造函數時手動指定 T 的值,因為構造函數會根據你傳入的參數 推斷 T 的值。

而且,事實上,在那種情況下,這讓我想知道為什麼你要限制 ConstantImpl.create() 僅接受 boolean 和 number 值。為什麼不走完全通用的路線呢?

  // accept any type
  public static create<T>(v: T): Constant<T> {
    return new ConstantImpl(v);
  }

希望那有幫助;祝你好運。

答案#2

正如我在評論中所說,函數重載在 TypeScript 中並不像在 JAVA 中那樣實現

你可以試試那樣的東西

export class ConstantImpl<T> {
    public static create(a: any): Constant<any> {
        if(typeof a == "Boolean")
           return ConstantImpl.createBoolean(a);
        if(typeof a == "Number")
           return ConstantImpl.createNumber(a);
    }
   public static createBoolean(b: Boolean): Constant<Boolean> {
    return new ConstantImpl<Boolean>(b);
   }

}

附註:我沒有測試/編譯這個特定的函數,它只是一個示例,類型可以存在