Почему не Typescript ошибка универсального типа объединения? - PullRequest
1 голос
/ 11 марта 2019
interface Foo<T extends 'fo' | 'foo'> {
  bla: T extends 'whyNoError?' ? string : number;
}

Ожидаемое поведение: увидеть что-то вроде:

Значение 'WhyNoError' никогда не произойдет

Факт: нет ошибок.

Так как я указываю, что T расширяет 'fo' или 'foo', почему Typescript не идентифицирует значение 'whyNoError' как никогда или всегда ложное?

1 Ответ

2 голосов
/ 11 марта 2019

Потому что условные типы не работают таким образом, я полагаю?Это интересное предложение иметь ошибку «недостижимый код» для части string этого условного типа, но я не могу представить, чтобы кто-то сильно заботился о его реализации.

Технически и педантично, я мог бы указатьиз-за того, что T может быть пересечением 'fo' & 'whyNoError?', которое, хотя и является абсурдным типом, который в конечном итоге сводится к never, ведет компилятор по пути, который может показаться удивительным:

interface Foo<T extends 'fo' | 'foo'> {
  bla: T extends 'whyNoError?' ? string : number;
}
declare const foo: Foo<'fo' & 'whyNoError?'>;
const str = foo.bla; // string !!

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

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

...