2017-02-24 4 views
0

typescriptでは、私が知っているオブジェクトに、includeUnassignedLocationscontractStatusCodesの2種類のプロパティ(それぞれKnockoutObservable<boolean>KnockoutObservableArray<number>のタイプ)を持つコードを実行したいと思います。使用できるさまざまなクラスがありますが、それらはすべて互いに異なるため、すべてのクラスをインターフェイスに実装したくありません。 typescriptにメソッドに渡されたオブジェクトにこれらのプロパティがあることをチェックする方法はありますか?typescriptでは、インターフェイスではなく、そのプロパティに基づいて型を指定するにはどうすればよいですか?

答えて

1

実際、オブジェクトの暗黙のインターフェイスに依存することができます。

というクラスがあり、その中にincludeUnassignedLocationscontractStatusCodesという名前があるとします。これら2つのプロパティを持つMyKnockoutInterfaceも定義しました。クラスが明示的にインターフェイスを実装していない場合でも、それは暗黙的に実装されます。したがって、MyKnockoutInterfaceタイプを予期するものはMyKnockoutClassで動作します。

class MyKnockoutClass { 
    includeUnassignedLocations: KnockoutObservable<boolean>; 
    contractStatusCodes: KnockoutObservableArray<number>; 
} 

interface MyKnockoutInterface { 
    includeUnassignedLocations: KnockoutObservable<boolean>; 
    contractStatusCodes: KnockoutObservableArray<number>; 
} 

function doSomething(object: MyKnockoutInterface) { 
} 

var object = new MyKnockoutClass(); 
doSomething(object); 
+1

これは、私が投稿したソリューションよりも優れた練習に思えます。それは確かに控えめな構文であり、インターフェース名を持つことは、そのプロパティが何であるかを明確にすることを意味します。 – Tim

2

はい、インタフェースではなく、オブジェクトのリテラル表記を使用して型を指定できます。 getMyObject()の結果に2つのプロパティがない場合、またはプロパティ自体のタイプが間違っている場合、次のコードでタイスクリプトエラーが発生します。

var myObject: { 
    //this can be any type which implements these properties 
    includeUnassignedLocations: KnockoutObservable<boolean>, 
    contractStatusCodes: KnockoutObservableArray<number>; 
}; 

myObject = getMyObject(); 

//do something with myObject here, safe in the knowledge it has those two properties 
関連する問題