2016-09-13 6 views
1

タイトルごとに。では、実際の値のサブセットである型を定義する適切な方法は何ですか?

私のIonic 2(Angular2/TS)アプリでは、緯度と経度を含むフィールドセット(高度:数値などのフィールドも含む)を返すコードバプラグイン(ジオロケーション)を使用しています。

これらは、しかし、私の興味の唯一の2つの分野ですので、私はタイプ定義された:これは最終的にも他のプロパティを(持っているでしょう変数の型を定義するための正しい方法です

coordinates: {latitude: number; longitude: number;}; 

を緯度など)? そうでない場合、正しい方法は何ですか?

答えて

4

Typescriptはタイプの形状をチェックし、必要なプロパティが存在するかどうかを確認できる限り、追加のプロパティを許可することができます。

たとえば、あなたのようなタイプと機能を定義することができます

type Coordinates = {latitude: number, longitude: number}; 

function logCoordinates(coords: Coordinates) { 
    console.log('coordinates:', coords.latitude, coords.longitude); 
} 

をして活字体は喜んでこれらの呼び出しのいずれかを受け入れます:

logCoordinates({latitude: 1, longitude: 2}); 

// assuming we have a CoordinateClass know to have lat and long 
const coordinates = new CoordinateClass(1, 2); 
logCoordinates(coordinates); 

型注釈が契約の形状を説明します。私たちが証明できるどんなパラメータもその契約を満たすことができます。ただし、追加のプロパティは常に許可されるとは限りません。

あなたは余分な性質を持っており、オブジェクトリテラルを渡す場合 - クラスのインスタンスは、この問題を持っていない - あなたが希望のタイプにそれらをキャストする必要があります。

logCoordinates(<Coordinates>{latitude: 1, longitude: 2, altitude: 3}); 

あなたはより多くを解決することができますas described hereを堅牢に使用します。一致しないキーを受け入れることでキャストする必要がなくなります。

type Coordinates = {latitude: number, longitude: number} & {[key: string]: number}; 
+0

回答ありがとうございます。なぜあなたは(私はあなたがAngular2のクラスについて話していたと思いますか) "クラスインスタンスにはこの問題はありません"を明確にすることはできますか? – dragonmnl

+0

@dragonmnl追加のプロパティができないようにする型チェックは、クラスのインスタンス(TS、ES6、または従来のもの)ではなくオブジェクトリテラルにのみ適用されます。 – ssube

関連する問題