Тип возврата 'никогда', если необязательному параметру задано определенное значение.

У меня есть функция, которая принимает необязательный аргумент boolean, который по умолчанию равен false. Когда аргумент равен false, функция возвращает string. Когда аргумент равен true, функция должна возвращать тип never.

Вот что я пробовал:

function example(arg: true): never;
function example(arg = false): string {
  //...
}

Кажется, что это должно работать: предполагается, что arg имеет тип boolean, и когда он не передается или передается как false, example возвращает string. Когда он передается как true, срабатывает перегрузка, и example возвращает never.

Однако это совсем не работает. TypeScript дает arg тип true и делает его обязательным, а example всегда возвращает never.

Я тоже попробовал это безумие, и подобрался поближе:

function example(arg: false): string;
function example(arg: true): never;
function example(arg: boolean): string | never;
function example(arg = false): string | never {
  //...
}

Однако компилятор по-прежнему не считает arg необязательным.


person Ian    schedule 15.10.2019    source источник


Ответы (1)


Кажется, это работает:

function example(arg: true): never;
function example(arg?: false): string;
function example(arg: boolean): string;
function example(arg: boolean = false): never | string {
    if (!arg) {
        return 'foo';
    }

    throw new Error();
}

const foo = example(true); // typeof foo is never
const bar = example(false); // typeof bar is string
const baz = example(); // typeof baz is string

Link to playground

person Chris Yungmann    schedule 15.10.2019
comment
Спасибо! Мне удалось заставить его работать, используя ваш код, но добавив дополнительную перегрузку example(arg: boolean): never | string для случаев, когда переданная переменная имеет тип boolean, а не true или false. - person Ian; 15.10.2019
comment
@ Ян, ах, я пропустил эту часть! Обновил ответ. - person Chris Yungmann; 15.10.2019