Учитывая, что у меня есть такой объект: const props = [{name: 'car', list: {brand: 'audi', model: 's4'} {name: 'motor », list: {type:' ktm ', color: 'orange'}] постоянным; Я бы хотел ...

1
Paulo Soares 3 Мар 2021 в 18:11

1 ответ

Лучший ответ

Вы можете использовать переназначение клавиш , которое было введено в TypeScript 4.1 (docs) для достижения этой цели:

type IndexKeys<T> = Exclude<keyof T, keyof []>
type ListProp = { name: string, list: object }
type GetName<P> = P extends ListProp ? P['name'] : never
type GetListKeys<P> = P extends ListProp ? keyof P['list'] : never

type PropsFromList<PropList extends ReadonlyArray<ListProp>> = {
  [i in IndexKeys<PropList> as GetName<PropList[i]>]?: GetListKeys<PropList[i]>
}

type Props = PropsFromList<typeof props>
// Inferred type:
// Props: {
//     car?: "brand" | "model" | undefined;
//     motorcycle?: "type" | "color" | undefined;
// }

Обратите внимание, что, как и при использовании Partial, дополнительные типы свойств получают дополнительный, но безвредный | undefined.

TypeScript детская площадка

1
Oblosys 3 Мар 2021 в 17:01