2017-11-20 9 views
0

を複製、私は私のクラスにこれら二つのstaticファクトリメソッドを作成しました:活字体:関数の実装メッセージ

重複機能の実装:

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); 
    } 
} 

しかし、私はこのコンパイルエラーメッセージが出ています。

+0

私はあなたがtypescriptでそのようなことをすることはできませんと思う、ソリューションは作成することができます(任意:)定数次にchecのタイプと特定の関数を呼び出す – CharybdeBE

+0

彼らは同じ名前を持っています。そのために、オーバーロードを使用することができます。 「オーバーロード」のセクションをご覧ください:https://www.typescriptlang.org/docs/handbook/functions.html – cartant

+0

@CharybdeBEいくつかの例が答えを教えてくれますか? – Jordi

答えて

2

@cartantが示唆したように、overloadsを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()booleannumber値を受け入れることができます、そして、それは他のすべてを拒否します。私はそれがbooleannumberであるかどうかを確認するためにvの種類を検査しなければならなかったことに注意してください、またコンストラクタ推測するので、私は、手動でConstantImpl<T>をコンストラクタでTの値を指定する必要がなかったですあなたが渡す引数からTの値。

そして本当に、その場合には、それはあなたがbooleannumber値を受け入れるだけにConstantImpl.create()を制限するために気になぜ私は思ってしまいます。代わりに完全な一般的なルートを行ってみませんか?

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

がんばろう。

-1

としては、それはたとえば

のためにJAVAにあるように私のコメントのオーバーロードはtypescriptですで実装されていない中であなたはその

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); 
    } 

} 

psのような何かを試すことができます言った:私は、この特定のコンパイル/テストしていませんこれは単なる例である。タイプは存在する可能性がある。