2017-09-07 3 views
0

私はジェネリック型の項目を渡しているメソッドで抽象クラスを持っています。次に、私はこのアイテムのプロパティを取得する必要があります、どのように正しく行うには?ジェネリックタイプのプロパティを取得するには?

export abstract class BaseService<T> { 
    ... 
    public saveItem(item: T) { 
     ... 
     if (item.id <=== here I got error) { 
     } 
     ... 
    } 

    export class ClusterItem { 
     id: number; 
     ... 
    } 

    export class ClustersService extends BaseService<ClusterItem> { 
     ... 
    } 
+1

特定のプロパティにアクセスしようとする前に[型ガード](https://www.typescriptlang.org/docs/handbook/advanced-types.html)を使用して型をチェックしたり、 ['id'] ' –

+3

恐らく' T extends {id:number} 'はジェネリック型をそのプロパティを持つものに制約します。 – jonrsharpe

答えて

2

あなたのコードは、あなたのクラスに使用するすべてのタイプTid性を有していてもよいことを想定しています。

あなたの質問に対する彼のコメントで指摘されているように、型の安全性と表現力の両方の点で正しいアプローチは、この仮定を型制約として宣言して、それを明示的に型チェッカーに知らせることです。

これを行う方法は、ジェネリック型パラメータに型制約構文を使用することです。例えば

、あなたはここでは、コードを読みやすくするためのインタフェースを定義しましたが、文字通りのタイプが同様に働くだろう

export interface MayHaveId { 
    id?: number; // you can use any type, number is just an example 
} 

export abstract class BaseService<T extends MayHaveId> { 
    saveItem(item: T) { 
    if (item.id || id === 0) { 
     console.log(id); 
    } 
    } 
} 

を書くことができます。

idプロパティは、ロジックに値を必要としないため、オプションとして宣言されています。

idのタイプ引数を持つバスクラスのみを使用する場合は、プロパティを必須にする必要があります。これは、コードを理解しやすくし、最初にそのような型でのみ使用されることを保証することによって、コンパイル時に多くのエラーを検出します。

関連する問題