Typescript сужает союзы, когда вы используете type-guard.Путаница возникает из-за того, где объединение.
В Variant1
объединение находится на элементе kind
, поэтому машинопись сужает это объединение до never
на ветви default
.Это означает, что x
по-прежнему имеет тип Variant1
, а kind
по-прежнему доступен на x
, просто тип kind
на данный момент равен never
In Variant2
объединение происходит по самому параметру x
, поэтому сужается x
.Эта версия также называется дискриминируемым объединением с kind
, являющимся дискриминатором.Поскольку все kinds
были проверены, default
x
будет сужен до never
и, таким образом, доступ к kind
станет ошибкой.