2017-06-03 4 views
0

enumパラメータでオーバーロードされた関数を使用して型推論を実行できますか?例えば、私はその戻り値の型列挙型の値に依存ファクトリ関数を作成しようとしていると言う:enum paramsでオーバーロードされた関数の型推論?

enum Colors { 
    Red, 
    Green 
}; 

abstract class Box { }; 
class RedBox extends Box { }; 
class GreenBox extends Box { }; 

class BoxFactory { 
    static createBox(color: Colors.Red): RedBox; 
    static createBox(color: Colors): Box { 
    switch (color) { 
     case Colors.Red: 
     return new RedBox(); 
     case Colors.Green: 
     return new GreenBox(); 
    } 
    } 
} 

function makeMeABox(color: Colors) { 
    // Argument of type 'Colors' is not assignable to parameter of type 'Colors.Red' 
    return BoxFactory.createBox(color); 
} 

playground

私は宣言ファイルを生成する場合、一般的な過負荷にも表示されません。アップ。ただし、オーバーロードを削除すると問題はありませんstatic createBox(color: Colors.Red): RedBox;。その後

class BoxFactory { 
    static createBox(color: Colors.Red): RedBox; 
    static createBox(color: Colors): Box; // <--- THIS ONE 
    static createBox(color: Colors): Box { 
    switch (color) { 
     case Colors.Red: 
     return new RedBox(); 
     case Colors.Green: 
     return new GreenBox(); 
    } 
    } 
} 

+0

とC++ – Dummy

答えて

1

は1人のだけの署名不足している

let a = BoxFactory.createBox(Colors.Red); // type of a is RedBox 
let b = BoxFactory.createBox(Colors.Green); // type of b is Box 

code in playgroundを)戻り値の型をしてもJavaのような静的型付け言語の関数署名の一部と見なされることはありません

+0

あなたのアプローチは素晴らしい、感謝の作品!関数のシグネチャと同じ余分なオーバーロードが必要な理由を理解できたら助かりますか?オーバーロードされた場合、コンパイラはプライマリ関数の署名を解決しませんか? –

+1

実際の実装のシグネチャはオーバーロードリストの一部ではありません。つまり、あなたのコードにはただ1つのシグネチャ( 'color = Colors.Red')しかないので、私のコードは一般的なケースの2番目のシグネチャを追加します。この場合、実装のシグネチャと一致します。 –