Можете ли вы создать кортеж типов свойств объекта? - PullRequest
0 голосов
/ 20 июня 2020

Учитывая такой тип, как:

type A = {a:string, b:string};

, я хотел бы создать кортеж со всеми свойствами A. Т.е. что-то вроде этого (синтаксис не важен - только сгенерирован правильный тип):

type AProps = PropsToTuple<A>; // -> ["a", "b"]

Есть ли способ добиться этого?

1 Ответ

0 голосов
/ 21 июня 2020

Кортеж подразумевает порядок. Свойства типа объекта не имеют определенного порядка. Как TypeScript узнает, что свойство должно быть go первым в AProps?

Если вам нужен кортеж, вам нужно указать TypeScript, какой желаемый порядок.

type A = { a: string, b: string };

export const enumerate = <T>() =>
  <U extends T[]>(...elements: WhenIncludesEvery<T, U>): U => elements;

type IncludesEvery<T, U extends T[]> =
  T extends U[keyof U]
    ? true
    : false;

type WhenIncludesEvery<T, U extends T[]> =
  IncludesEvery<T, U> extends true
    ? U
    : never;

const tuple = enumerate<keyof A>()('a', 'b'); // ["a", "b"] 

type AProps = typeof tuple;

Это решение требует функция, которая вызывается во время выполнения, и является более сложной, но она гарантирует, что каждое свойство a) указано в списке b) указано только один раз.

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