Comment obtenir le type d'une propriété d'interface dans TypeScript?

Oct 03 2020

J'ai donc un code comme:

interface MyInterface{
  a:any,
  b:string,
  c:boolean,
  d:number,
  readonly valueChanges:Subject<{key: keyof MyInterface, value: ???}>
}

où je ne sais pas comment écrire le type de la valeur sous la bonne «clé». J'ai essayé le typeof MyInterface[key]mais ce n'est probablement pas comment le résoudre. :(

Merci pour votre temps à l'avance!

Réponses

2 LindaPaiste Oct 03 2020 at 02:12

Vous pouvez utiliser le AllValuestype d'utilitaire publié par Titian Cernicova-Dragomir . Notez que vous n'en avez pas besoin extends Record<PropertyKey, PropertyKey>car cela est spécifique au problème de l'inversion.

type AllValues<T> = {
    [P in keyof T]: { key: P, value: T[P] }
}[keyof T]

Vous appliquez ensuite ce type à votre interface, mais assurez-vous que ce {key: valueChanges...}n'est pas l'une de vos options.

type KeyValueObject = AllValues<Omit<MyInterface, "valueChanges">>
interface MyInterface{
  a: any;
  b: string;
  c: boolean;
  d: number;
  readonly valueChanges: Subject<AllValues<Omit<MyInterface, "valueChanges">>>;
}

Je n'aime pas le référencement circulaire ici, donc personnellement je le diviserais en morceaux composables. MyInterfacefinirait par être un typeplutôt qu'un interface, mais il y a très peu de différence pratique.

interface BaseInterface {
  a: any;
  b: string;
  c: boolean;
  d: number;
}

type WithValueChanges<T> = T & {
    readonly valueChanges: Subject<AllValues<T>>
}

type MyInterface = WithValueChanges<BaseInterface>