Почему условный тип с любым работает иначе? - PullRequest
0 голосов
/ 13 июля 2020

Вопрос довольно простой, почему в этой ситуации type s является объединением обеих переменных.

type s = any extends boolean ? 'Yes' : 'no';

Кажется логичным, что любой тип может быть буквально любым, но есть ли лучшее объяснение этому поведение?

1 Ответ

1 голос
/ 14 июля 2020

Я мог бы высказать свое мнение о том, почему это так, но я так понимаю, это не совсем то, о чем вы просите.

Единственное каноническое Я могу найти объяснение того, почему происходит такое поведение, из комментария в строках с # 13287 по # 13290 из checker.ts, где оно реализовано (вы не можете напрямую просматривать файлы такого размера на GitHub ?‍♂️) :

// Return union of trueType and falseType for 'any' since it matches anything
if (checkType.flags & TypeFlags.Any) {
  (extraTypes || (extraTypes = [])).push(
    instantiateTypeWithoutDepthIncrease(root.trueType, combinedMapper || mapper)
  );
}

Все другие ссылки, которые я могу найти на это поведение, просто подтверждают, что это именно так, а не почему . Например, microsoft / TypeScript # 27418 спрашивает, какие условные типы, где проверенный тип unknown должен оцениваться, и упоминает: «Чтобы добавить путаницы, any также имеет собственное поведение с подстановочными знаками, которое соответствует обеим веткам ". В этом случае unknown extends X ? T : F вернет только T, если X равно unknown, и F в противном случае; он никогда не возвращает T | F. ?

Итак, наиболее близкий к авторитетному ответу, который я могу здесь увидеть, является то, что разработчик сказал: «any соответствует чему угодно, поэтому верните объединение обеих ветвей». Ну что ж, надеюсь, что это поможет; удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...