Как получить тип свойства интерфейса в TypeScript?

Oct 03 2020

Итак, у меня есть такой код:

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

где я не знаю, как написать тип значения под правильным «ключом». Я пробовал, typeof MyInterface[key]но, вероятно, это не способ решения. :(

Заранее благодарим за уделенное время!

Ответы

2 LindaPaiste Oct 03 2020 at 02:12

Вы можете использовать AllValuesтип утилиты, опубликованный Тицианом Черниковой-Драгомиром . Обратите внимание, что вам не нужно, extends Record<PropertyKey, PropertyKey>поскольку это относится к проблеме инвертирования.

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

Затем вы применяете этот тип к своему интерфейсу, но убедитесь, что {key: valueChanges...}это не один из ваших вариантов.

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

Мне не нравятся здесь круговые ссылки, поэтому лично я бы разбил их на составные части. MyInterfaceбудет typeскорее как a , чем как an interface, но практической разницы здесь очень мало.

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

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

type MyInterface = WithValueChanges<BaseInterface>