TypeScript: массив условных типов распределения типа объединения - PullRequest
0 голосов
/ 01 января 2019

У меня есть условный тип, который использует универсальный тип T для определения типа Array<T>.В качестве надуманного примера:

type X<T> = T extends string ? Array<T> : never;

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я предоставляю тип объединения, он распространяется как объединение двух типов массивов вместо массива моего типа объединения.

// compiler complains because it expects Array<'one'> | Array<'two'>
const y: X<'one' | 'two'> = ['one', 'two'];

Есть ли способ напечатать это так, что мой условный тип производит массив <'one' |'two'> если условие выполнено?

1 Ответ

0 голосов
/ 01 января 2019

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

Самый простой способ отключить это поведение - поместить параметр типа в кортеж:

type X<T> = [T] extends [string] ? Array<T> : never;

// ok y is Array<'one' | 'two'>
const y: X<'one' | 'two'> = ['one', 'two'];

Выможете прочитать больше об этом поведении здесь и здесь

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