Могу ли я вывести тип кортежа из возвращаемого типа функции без использования 'as const'? - PullRequest
1 голос
/ 06 мая 2020

Я хочу использовать функцию, которая создает массив в качестве аргумента, где каждый элемент может быть разного типа. Порядок типов имеет значение, и мне нужно сохранить их порядок как кортеж. Вот один из способов:

const create = <T>(spec: (...args: any[]) => T) => spec;
const result = create(() => ['a', 2, 'a'] as const);
type t = ReturnType<typeof result>; // t is ['a', 2, 'a']

Однако это означает, что разработчик должен не забывать добавлять as const каждый раз, когда они используют create.

В моем случае порядок использования типы всегда актуальны, и функция всегда должна получать кортеж.

Есть ли способ заставить Typescript всегда выводить кортеж из возвращаемого типа без необходимости as const?

1 Ответ

5 голосов
/ 06 мая 2020

Вы можете намекнуть компилятору, что общий аргумент типа c должен выводиться как тип кортежа, если вы укажете его ограничение как [any] | any[].

const create = <T extends [any] | any[]>(spec: (...args: any[]) => T) => spec;
const result = create(() => ['a', 2, 'a']);
type t = ReturnType<typeof result>; // t is [string, number, string]

Playground Link

Кажется невозможным вывести буквальную константу, такую ​​как ['a', 2, 'a'].

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