Typescript: как объяснить это взаимодействие между extends и типом функции - PullRequest
0 голосов
/ 01 марта 2019

Пример 1 имеет смысл для меня

type X = (1 | 2 | 3) extends (infer I) ? [I] : never;

// X = [1 | 2 | 3]

Пример 2 Я не знаю, почему переменные типа теперь пересекаются

type X = (
    ((_: 1) => void) | ((_: 2) => void) | ((_: 3) => void)
) extends ((_: infer I) => void) ? [I] : never;

// X = [1 & 2 & 3]

Я предполагаю, что имеет некоторое отношение /сходство с этим:

type X = { x: number } | { y: number } | { z: number };
type Y = keyof X;

// Y = x & y & z

Однако я не могу убедить себя, что понял это по первому принципу.Хотелось бы услышать, как это можно объяснить.

1 Ответ

0 голосов
/ 01 марта 2019

Это было раскрыто в примечаниях к выпуску, когда вывод типа из условных типов .Будет ли это объединение или пересечение, зависит от дисперсии предполагаемого типа.Интуитивно понятно, что если тип выводится как общий тип для нескольких значений, он может быть любым из них (объединение), но если он выводится как тип аргумента для нескольких функций, он должен быть приемлем для любой из них (пересечение).

Цитата из примечаний к выпуску:

В следующем примере показано, как несколько кандидатов на одну и ту же переменную типа в совпадающих позициях приводят к выводу типа объединения:

type Foo<T> = T extends { a: infer U, b: infer U } ? U : never;
type T10 = Foo<{ a: string, b: string }>;  // string
type T11 = Foo<{ a: string, b: number }>;  // string | number

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

type Bar<T> = T extends { a: (x: infer U) => void, b: (x: infer U) => void } ? U : never;
type T20 = Bar<{ a: (x: string) => void, b: (x: string) => void }>;  // string
type T21 = Bar<{ a: (x: string) => void, b: (x: number) => void }>;  // string & number

Дальнейшее обсуждение можно найти в PR реализует эту функцию.

В качестве примечания, он позволяет использовать некоторые интересные трюки, такие как объединение в тип пересечения .

...