Typescript: как объяснить это взаимодействие между extends и типом функции

Если вы действительно пишете C, и набор ключей известен, вы бы гораздо лучше сохранили значения в struct вместо некоторой раздутой хеш-таблицы. Есть таблица static const:

  • имя ключа
  • тип (целое число / строка, вероятно, достаточное)
  • offset в struct (используя offsetof ] macro)

и использовать это для синтаксического анализа строки запроса и заполнения структуры.

4
задан Viele 1 March 2019 в 00:55
поделиться

1 ответ

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

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

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

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 реализует эту функцию.

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

0
ответ дан artem 1 March 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: