Условный тип возврата и сужение литерала - PullRequest
1 голос
/ 19 апреля 2019

Я просто не понимаю, почему это не компилируется (TS 3.4.3).Может ли кто-нибудь объяснить мне или исправить мой код?Что мне здесь не хватает?

function run<A extends 'open'>(action: A): A extends 'open' ? 'yes' : never {
    if (action === 'open') {
        return 'yes'
    }
}

Этот пример сводится к неработающей части.Это должна быть функция, которая вызывается с определенными действиями (A), и предполагается, что каждое из них имеет определенные возвращаемые значения.

Действие «открыть» возвращает «да» или «нет» Действие «отправить» возвращает «успех» или «сбой» и т. Д.

Ошибка Я получаю здесь:

В функции отсутствует конечный оператор возврата, а тип возвращаемого значения не включает «неопределенное»

Тип «да» не может быть назначен типу «А» расширяет «открытый»?«да»: никогда '

Возможно ли это вообще с Typescript?

1 Ответ

1 голос
/ 19 апреля 2019

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'
    }
}
...