Встраивание условного типа в машинописный текст? - PullRequest
0 голосов
/ 07 мая 2020

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

Например, если я использую условное выражение Extract , я получаю другое поведение, если я встраиваю его, и если я использую его как общий c:

// setup
type TUnion = ['foo', 1] | ['baz', 2];
type TDiscriminator = ['foo', any];

// using the conditional generic
type Extract<T, U> = T extends U ? T : never;
type TExtracted = Extract<TUnion, TDiscriminator>; // ["foo", 1]

// inlining the conditional
type TInlined = TUnion extends TDiscriminator ? TUnion : never; // never

Когда я sh об этом дальше, мне кажется, что значение T нужно передать в:

type ExtractWithU<T> = T extends TDiscriminator ? T : never;
type TExtractedWithU = ExtractWithU<TUnion>; // ["foo", 1]

type ExtractWithT<U> = TUnion extends U ? TUnion : never;
type TExtractedWithT = ExtractWithT<TDiscriminator>; // never

Я упустил что-то действительно простое?

1 Ответ

0 голосов
/ 07 мая 2020

Из приведенной выше цепочки комментариев с jcalz и Titian проблема в том, что общий c распространяется, а встроенный - нет.

Конкретно

// setup
type TA = ['foo', 1];
type TB = ['baz', 2];
type TUnion = TA | TB;
type TDiscriminator = ['foo', any];

// using the conditional generic
type Extract<T, U> = T extends U ? T : never; 
type TExtracted = Extract<TUnion, TDiscriminator>; // ["foo", 1]
//              = Extract<TA | TB, TDiscriminator>
//              = Extract<TA, TDiscriminator> | Extract<TB, TDiscriminator>
//              = TA | never
//              = TA

// inlining the conditional
type TInlined = TUnion extends TDiscriminator ? TUnion : never; // never
//            = never, because the union isn't a subtype of the discriminator
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...