TypeScript / Angular2でインターフェースとモデルを使用する場合


197

TypeScriptを使用したAngular 2のチュートリアルを最近見ましたが、インターフェイスを使用する場合と、モデルを使用してデータ構造を保持する場合がわかりません。

インターフェースの例:

export interface IProduct {
    ProductNumber: number;
    ProductName: string;
    ProductDescription: string;
}

モデルの例:

export class Product {
    constructor(
        public ProductNumber: number,
        public ProductName: string,
        public ProductDescription: string
    ){}
}

URLからJSONデータを読み込み、インターフェース/モデルにバインドしたいのですが。単一のデータオブジェクトが必要な場合もあれば、オブジェクトの配列や配列を保持したい場合もあります。

どちらを使用する必要がありますか?その理由は?


13
カスタムロジックの初期化が必要な場合はクラスを使用します。これはコンパイル時にのみ使用できるため、それ以外の場合は常にインターフェースを使用します。typescriptインターフェースはjavascriptに存在しないため、javascriptにコンパイルされません。
Dieterg、2016

6
Angular 2では、インターフェースは依存性注入では機能しないことに注意してください。ここではクラスを使用する必要があります。
jlang

回答:


137

インターフェイスはコンパイル時のみです。これにより、受信した期待されるデータが特定の構造に従っていることを確認することだけが可能になります。このため、コンテンツをこのインターフェイスにキャストできます。

this.http.get('...')
    .map(res => <Product[]>res.json());

次の質問をご覧ください。

クラスでも同様のことができますが、クラスとの主な違いは、実行時に存在し(コンストラクター関数)、処理を使用してメソッドを定義できることです。ただし、この場合は、オブジェクトをインスタンス化して使用できるようにする必要があります。

this.http.get('...')
    .map(res => {
      var data = res.json();
      return data.map(d => {
        return new Product(d.productNumber,
          d.productName, d.productDescription);
      });
    });

27
詳しい回答ありがとうございます。インターフェイスがコンパイル時にのみ使用される場合、コンパイラは実際にhttp getを調べずにJSONファイルの構造をどのようにチェックできますか?それができない場合は、インターフェイスに悩まされることのポイントは何ですか?
I_LIKE_FOO

7
@I_LIKE_FOOコンパイラはget呼び出しを調べる必要がありません。それはそれが知っているタイプとそれらが正しく整列されていることをチェックすることだけを気にします。var data = res.json();本当にvar data: any = res.json();コンパイラにあるので、の型チェックはすべて失われdataます。何ここでより有用であろうことはようなものになるだろうvar data: ProductDto[] = res.json();とのProductDtoインタフェースであることをモデル返されたJSON内のデータ構造。
GFoley83 2017

3
詳細:angular.io/guide/styleguide#style-03-03をAngular style guide says not to use interfaces.Always use classes.参照
Sampath

4
はい、しかし問題は、それらがTypescriptを設計したグルの神ではないということです。それはマイクロソフトと会社です。彼らは適切な場合、インターフェースとクラスを好む傾向があります。また、ボーナスポイント... 1つはランタイムで、もう1つはコンパイル時です
Tom Stickel '21

11
@Sampathおそらく、この「データモデルのインターフェイスを使用することを検討してください。」が表示されるので、おそらくAngularスタイルガイドが更新されています。暗黙的に、データモデルのクラスよりもインターフェイスが優先されます。
Mikezx6r 2018

40

インターフェイスは、契約のいずれかを説明したクラスや新しいタイプを。これは純粋なTypescript要素なので、Javascriptには影響しません。

モデル、つまりクラスは、新しいオブジェクトを生成するために使用されている実際のJS関数です。

URLからJSONデータを読み込み、インターフェース/モデルにバインドしたいのですが。

モデルに移動します。それ以外の場合は、JavaScriptのJSONのままです。


4

@ThierryTemplierがサーバーからデータを受信し、コンポーネント間でモデルを送信する(インテリセンスリストを保持し、設計時エラーを発生させる)と述べたように、インターフェイスを使用することは問題ありませんが、サーバー(DTO)にデータを送信する場合は、クラスを使用することをお勧めしますモデルからDTOを自動マッピングする利点。


-22

すべての調査の結果、私が発見したインターフェイスの代わりにクラスを使用します。

どうして?クラスだけでは、クラスプラスインターフェースよりもコードが少なくなります。(とにかく、データモデルのクラスが必要になる場合があります)

どうして?クラスはインターフェースとして機能できます(拡張の代わりに実装を使用)。

どうして?インターフェイスクラスは、Angular依存関係注入のプロバイダールックアップトークンにすることができます。

Angular Style Guideより

基本的に、クラスはすべてのことを実行できます。したがって、インターフェイスを使用する必要はないかもしれません


10
Angular Style Guideは現在、実際に次のように述べています
Alex Peters

@AlexPeters本物のリンクを提供してください。よろしく
お願いします

@AnandPhadke確かに、上記の私のコメントの頃からのAngular Style GuideへのWayback Machineリンクがあります。
アレックスピーターズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.