在无法访问代码路径时抑制 "not all paths return a value" Typescript 警告

Suppressing the "not all paths return a value" Typescript warning when a code path is unreachable

我有一个函数 foobar(x:string) 如果 x 是空字符串,它不会 return。否则,它 return 另一个字符串。

所以我不能声明为return"never",如果我声明为return"string",TS没有意识到后面的代码可能达不到

(是的,这是一个糟糕的设计。不,我不能改变它)

有时,我需要在另一个函数中将它与空 x 一起使用,而在其他分支中 returns 是一个值。所以像

function f(n:number) 
{

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

}

TS 抱怨因为不是所有路径 return 一个值。所以我想告诉编译器 foobar 不会 return (或者,等价于它之后的代码是不可访问的)。编造一些东西,比如:

function f(n:number) 
{

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

}

我可以这样做吗?我还可以做些什么?我可以 return 类型的东西 never,也许,但是我怎么才能得到 never "value" 到 return?

你试过函数重载吗:

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;
  }
}