Typescript теперь не означает, что A
будет 'open'
, даже если вы проверите параметр action
. Защита типа не будет влиять на A
только на action
. Это означает, что машинопись не может разрешить условный тип на основе этого типа защиты.
Простой обходной путь - использование отдельной общедоступной подписи с условным типом, но при этом сигнатура реализации возвращает объединение.
Также never
не означает, что он ничего не возвращает, это означает, что он никогда не возвращается, вы ищете void
function run<A extends 'open'>(action: A): A extends 'open' ? 'yes' : void
function run<A extends 'open'>(action: A): 'yes' | void
{
if (action === 'open') {
return 'yes'
}
}