2017-05-13 8 views
0

文字列パラメータに基づいて関数の戻り値を変更し、汎用型を提供しないようにするにはどうすればよいでしょうか?Typescriptで文字列別の型を返す

interface Type1 { typeName: string; }; 
interface Type2 { typeVersion: string; }; 
type AllTypes = Type1 | Type2; 

function returnTypes(t: string): AllTypes { 
    ... 
} 

const typeResult = returnTypes('type1'); 
console.log(typeResult.typeName); 

戻り値は定義されていません。あなたは、テンプレートの種類 https://www.typescriptlang.org/docs/handbook/generics.html

private returnTypes<T>(arg:T): T { 
    return arg 
} 

を使用することができます

答えて

0

そうしないと、あなたの引数

returnTypes(arg:string): AllTypes { 
    switch(arg){ 
     case "type1": return SomethingOfType1 
     case "type2": return SomethingOfType2 
    } 
} 

あなたがしようとしているかについて、もう少し情報に基づいてスイッチの例を設定する必要があると思います達成すると助けになるかもしれません。

+0

このソリューションは、最後に、問題を解決することはできません種類を確認する必要が回避でき、あなたの関数がCommonStuff

returnTypes(str:String) : CommonStuff { let x : Type1; let y : Type2; ... const z = someCondition ? x : y ; return z; } 

の型を返す必要がありひとたび関数が結果を返すと、それは 'Type1'か' Type2'です。 – PRAISER

1

は、あなたがこのように機能をオーバーロードするとき、実装の署名が発信者に利用できないように

interface Type1 { typeName: string; }; 
interface Type2 { typeVersion: string; }; 
type AllTypes = Type1 | Type2; 

function returnTypes(t: 'type1'): Type1; 
function returnTypes(t: 'type2'): Type2; 
function returnTypes(t : 'type1' | 'type2'): AllTypes { 
    switch (t) { 
     case "type1": return { typeName: "test" }; 
     case "type2": return { typeVersion: "test" }; 
    } 
} 

console.log(returnTypes('type1').typeName); 
console.log(returnTypes('type2').typeVersion); 

ノートのようなオーバーロードされた宣言を作成します。事前に指定された宣言のみが、オーバーロードされた関数のインタフェースを構成します。

UPDATE: TypeScriptが返すタイプをTypeListsが認識していることを示す固定および完全な例。

+1

文字列である 't'を返す型' Type'または型2に変換しますか? – PRAISER

+0

Rodrigo、ありがとう、編集してください。今ははるかに明確です。 @容疑者私は質問を理解しているかどうかわからない、あなたはそれを言い換えることができますか? –

0

何をしようとしているのかわかりませんが、のように見えますが、いくつかのタイプのいずれかを返す関数を定義しようとしています。たとえば、関数はType1またはType2を返します。 2つの型が共通の機能を共有していない限り、返されたオブジェクトに対して異なるメソッドを呼び出す前に型をチェックする必要があります。

返すオブジェクトをとすると、は共通の機能を共有しているため、インターフェイスで定義し、返す各オブジェクトタイプがそのインターフェイスを実装することを宣言する方がよいでしょう。

例としてです。

interface CommonStuff { 
    someFunction(); 
    someOtherFunction(); 
} 

class Type1 implements CommonStuff { 
    someFunction() {} 
    someOtherFunction() {} 
} 

class Type2 implements CommonStuff { 
    someFunction() {} 
    someOtherFunction() {} 
} 

その後、単にこれは後で

const something = returnTypes("blah); 
something.someFunction(); // you know something has a someFunction() method. 
+0

タイプは同じではありませんが、いくつかのプロパティが共通しているかもしれませんが、違いはコモンではないことを楽しみにしています。 私はそれをより明確にするために質問を更新しました。 – PRAISER

関連する問題