web-dev-qa-db-ja.com

プロパティはインターフェイスの文字列インデックスに割り当てることができません

私は以下のインターフェースを持っています:

export interface Meta {
  counter: number;
  limit: number;
  offset: number;
  total: number;
}

export interface Api<T> {
  [key: string]: T[];
  meta: Meta; // error
}

現在、次のエラーが発生しています。

タイプ「メタ」のプロパティ「メタ」は、文字列インデックスタイプ「T []」に割り当てることができません。

少し検索した後、私はこのステートメントを TS docs で見つけました:

文字列インデックスシグネチャは「ディクショナリ」パターンを説明する強力な方法ですが、すべてのプロパティが戻り値の型と一致することも強制します。これは、文字列インデックスがobj.propertyがobj ["property"]としても使用できることを宣言しているためです。

文字列インデックスシグネチャがある場合、この型と一致しないと他の変数を使用できないことを意味しますか?

実際、私はこのようなインターフェースを宣言するこのエラーを取り除くことができます:

export interface Api<T> {
  [key: string]: any; // used any here
  meta: Meta;
}

これを行うと、型推論の能力が完全に失われます。この醜い方法なしでこれを行う方法はありますか?

20
dev_054

2つのインターフェースの intersection を使用できます。

interface Api<T> {
    [key: string]: T[];  
}

type ApiType<T> = Api<T> & {
    meta: Meta;
}

declare let x: ApiType<string>;

let a = x.meta // type of `a` is `Meta`
let b = x["meta"]; // type of `b` is `Meta`

let p = x["someotherindex"] // type of `p` is `string[]`
let q = x.someotherindex // type of `q` is `string[]`
14
Saravana