Общий массив для возврата типизированных индексов - PullRequest
0 голосов
/ 21 февраля 2019

Может быть, это плохой вопрос или даже невозможен, но я долго бился об него головой и не могу понять.Заранее спасибо!

Универсальный T создает тип соединения:

const arrayToArray = <T>(values: T[]) => values;

Когда я использую функцию:

const result = arrayToArray([1, 'hi', 3]);

Создает тип:

const result: (string | number)[]

Я ищу, чтобы создать:

const result: [number, string, number]

Я надеюсь, что 'one' и 'three' вернут ошибку типа, потому что они не являются числами.

const useResultType: typeof result = ['one', 'two', 'three'];

1 Ответ

0 голосов
/ 21 февраля 2019

Если вы хотите получить кортежи из литерала массива, есть два способа убедить компилятор сделать это:

Использование кортежей в параметрах rest.Это удалило литерал массива из вызова:

const arrayToArray = <T extends any[]>(...values: T) => values;

const result = arrayToArray(1, 'hi', 3); //[number, string, number]

Использование объединения кортежей и ограничений массива для подсказки компилятору, что вы хотите объединение.Это сохраняет передачу параметра в виде массива:

const arrayToArray = <T extends [any] | any[]>(values: T) => values;

const result = arrayToArray([1, 'hi', 3]); // [number, string, number]

Или, если вы хотите кортеж только для чтения в 3.4 (еще не выпущенный), вы можете напрямую использовать утверждение as const:

const result = [1, 'hi', 3]  as const; // readonly [number, string, number]
...