web-dev-qa-db-fra.com

La propriété n'est pas attribuable à l'index de chaîne dans l'interface

J'ai les interfaces suivantes:

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

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

Actuellement, je reçois l'erreur suivante:

La propriété 'meta' de type 'Meta' n'est pas attribuable au type d'index de chaîne 'T []'.

Après avoir cherché un peu, j'ai trouvé cette déclaration dans TS docs :

Bien que les signatures d'index de chaîne soient un moyen puissant de décrire le modèle de "dictionnaire", elles imposent également que toutes les propriétés correspondent à leur type de retour. Cela est dû au fait qu'un index de chaîne déclare que obj.property est également disponible en tant que obj ["propriété"].

Cela signifie-t-il que lorsque j'ai une signature d'index de chaîne, je ne peux pas avoir d'autre variable sans correspondre à ce type?

En fait, je peux me débarrasser de cette erreur en déclarant l'interface comme ceci:

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

Ce faisant, je perds complètement la capacité d'inférence de type. Y a-t-il un moyen de le faire sans cette laideur?

20
dev_054

Vous pouvez utiliser une intersection de deux interfaces:

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