Подавление сообщения «не все пути возвращают значение» Предупреждение Typescript, когда путь кода недоступен - PullRequest
0 голосов
/ 05 мая 2020

У меня есть функция foobar (x: string), которая не вернет, если x - пустая строка. В противном случае он вернет другую строку.

Итак, я не могу объявить, что он возвращает «никогда», и если я заявляю, что он возвращает «строку», TS не понимает, что код впоследствии может быть недоступен

(Да, это ужасный дизайн. Нет, я не могу его изменить)

Иногда мне нужно использовать его с пустым x в другой функции, которая в других ветвях возвращает значение . Что-то вроде

function f(n:number) 
{

    if (n==0) {
        foobar("")
    }
    else
    {
        return n - 1
    }

}

TS жалуется, потому что не все пути возвращают значение. Поэтому я хотел бы сообщить компилятору, что foobar не возвращает (или, что то же самое, код после того, как он недоступен). Придумываю что-то вроде:

function f(n:number) 
{

    if (n==0) {
        foobar("")
        /** @notreachable */
    }
    else
    {
        return n - 1
    }

}

Могу я это сделать? Что еще я могу сделать? Я мог бы вернуть что-то типа never, может быть, но как мне получить никогда не возвращаемое «значение»?

1 Ответ

1 голос
/ 05 мая 2020

Пробовали ли вы перегрузку функций:

function foobar(val: string): string;
function foobar(val: ''): never;
function foobar(val: string): string {
  if (val === '') {
    // while (true) {
    //   console.log('Infinite loop also works fine');
    // }
    throw new Error('never returns');
  } else {
    return 'new value';
  }
}


function f(n: number) {
  if (n === 0) {
    foobar('');
  } else {
    return n - 1;
  }
}

Обновление Я думаю, что аналогичный подход будет работать и для пустых объектов:

interface NoProps {
  [a: string]: never;
}

interface X {
  a?: string;
}

function foobar(val: NoProps): never;
function foobar(val: X): string;
function foobar(val: NoProps | X): string {
  if (val.a === undefined) {
    throw new Error('never returns');
  } else {
    return 'new value';
  }
}


function f(n: number) {
  if (n === 0) {
    foobar({});
  } else {
    return n - 1;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...