Извлечь несоответствующие поля в Typescript

avatar
Daaavvy
9 августа 2021 в 05:22
144
1
0

С учетом такого набора данных -

const data = [
  {type: 'text', field: 'name'},
  {type: 'minMax', minField: 'min', maxField: 'max}
] as const;

Как извлечь все поля как тип? например 'имя' | 'мин' | 'макс.'

В данный момент я делаю это, но оно не масштабируется -

type fields = Extract<typeof data[number], {name: string}>['name'] | Extract<typeof data[number], {minName: string}>['minName'| 'maxName']
Источник
ale917k
9 августа 2021 в 05:27
0

Будут ли объекты в этом массиве разными?

Daaavvy
9 августа 2021 в 05:30
0

Предположим, что используются только типы text и minMax.

Ответы (1)

avatar
Shivam Singla
9 августа 2021 в 06:08
0

Нам нужно перебрать каждый тип объекта в массиве, опустить ключ "тип" и найти типы значений каждого объекта.

const data = [
  {type: 'text', field: 'name'},
  {type: 'minMax', minField: 'min', maxField: 'max'}
] as const;

type Data = typeof data;

type KeysValues<T> = T[keyof T]

type ExtractFields<D extends Readonly<any>> = D extends readonly [infer T, ...(infer R)]
  ? KeysValues<Omit<T, 'type'>> | ExtractFields<R>
  : never

type Fields = ExtractFields<Data> // 'name' | 'min' | 'max'

let test: Fields = 'name'
test = 'max'
test = 'max'
test = 'somethig else' // error

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