Преобразование типа объединения в тип пересечения

Есть ли способ преобразовать тип объединения в тип пересечения:

type FunctionUnion = () => void | (p: string) => void type FunctionIntersection = () => void & (p: string) => void 

Я хотел бы применить преобразование к FunctionUnion чтобы получить FunctionIntersection

Вы хотите, чтобы соединение пересекалось? Это могут сделать распределительные условные типы и вывод из условных типов . (Не знаю, как сделать перекресток к союзу, хотя.) Вот злая магия:

 type UnionToIntersection = (U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never 

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

Аналогичным образом, множественные кандидаты для переменной одного и того же типа в противоположных позициях вызывают тип пересечения, который должен быть выведен.


Посмотрим, сработает ли это.

Сначала позвольте мне в скобках включить FunctionUnion и FunctionIntersection потому что TypeScript, кажется, связывает объединение / пересечение более плотно, чем функция return:

 type FunctionUnion = (() => void) | ((p: string) => void); type FunctionIntersection = (() => void) & ((p: string) => void); 

Тестирование:

 type SynthesizedFunctionIntersection = UnionToIntersection // inspects as // type SynthesizedFunctionIntersection = (() => void) & ((p: string) => void) 

Выглядит неплохо!

Будьте осторожны, что в целом UnionToIntersection<> предоставляет некоторые сведения о том, что TypeScript считает фактическим объединением. Например, boolean по-видимому, внутренне представлено как true | false true | false , поэтому

 type Weird = UnionToIntersection 

становится

 type Weird = string & number & true & false 

Надеюсь, это поможет. Удачи!

  • Угловое redirect на страницу входа в систему
  • Использование плагина jQuery в TypeScript
  • Как использовать внешнюю библиотеку без машинописного текста из машинописного текста без .d.ts?
  • angular2 resolveAndCreate HTTP - отсутствует HTTP_PROVIDERS в RC7
  • Расширение массива в TypeScript
  • Как импортировать другие файлы TypeScript?
  • Инициализаторы типа TypeScript и поля
  • Как сделать объект JSON classом типов
  • Почему я получаю сообщение об ошибке? Объектный литерал может указывать только известные свойства?
  • Импорт узлов-модhive с помощью TypeScript
  • Что такое знак вопроса в имени параметра Typcript
  • Давайте будем гением компьютера.