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?
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[]`