Как преобразовать сопоставленный универсальный тип в объединение кортежей в машинописи - PullRequest
0 голосов
/ 28 июня 2019

Я создаю что-то похожее на Object.entries, и я бы хотел, чтобы оно было напечатано более строго. Я хочу создать тип, в котором данный объект возвращает строго типизированное объединение двух кортежей свойств этого объекта.

В настоящее время

export type Entries<T> = [keyof T, T[keyof T]][];

Entries<{first: number, second: string}> = ["first" | "second", number | string][]

Что бы я хотел

Entries<{first: number, second: string}> = ["first", number] | ["second", string][]

1 Ответ

2 голосов
/ 28 июня 2019

Вы должны использовать фактический сопоставленный тип с синтаксисом {[K in keyof T]: ...}, а затем посмотреть его свойства:

export type Entries<T> = { [K in keyof T]: [K, T[K]] }[keyof T][];

type E = Entries<{ first: number; second: string }>;
// type E = (["first", number] | ["second", string])[]

Вы можететакже используйте дистрибутивный условный тип , подобный этому, для работы которого требуется псевдоним вспомогательного типа:

type EntriesHelper<T, K> = K extends keyof T ? [K, T[K]] : never;
type Entries<T> = Array<EntriesHelper<T, keyof T>>;

type E = Entries<{ first: number; second: string }>;
// type E = (["first", number] | ["second", string])

или подобный этому, который вместо логического вывода использует в условных типах хелпера:

type Entries<T> = Array<
  keyof T extends infer K ? (K extends keyof T ? [K, T[K]] : never) : never
>;

type E = Entries<{ first: number; second: string }>;
// type E = (["first", number] | ["second", string])[]

Они все выдают здесь один и тот же результат, но могут действовать по-разному, учитывая необязательные свойства или другой крайний случай, поэтому будьте осторожны.Надеюсь, это поможет;удачи!

Ссылка на код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...