Я мог бы высказать свое мнение о том, почему это так, но я так понимаю, это не совсем то, о чем вы просите.
Единственное каноническое Я могу найти объяснение того, почему происходит такое поведение, из комментария в строках с # 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
соответствует чему угодно, поэтому верните объединение обеих ветвей». Ну что ж, надеюсь, что это поможет; удачи!