首页 > 解决方案 > 当代码路径无法访问时,抑制“并非所有路径都返回值”Typescript 警告

问题描述

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

所以我不能声明它返回“never”,如果我声明它返回“string”,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
    }

}

我可以这样做吗?我还可以做些什么?我可以永远返回某种类型的东西,也许,但是我怎样才能得到一个永远不会返回的“值”呢?

标签: typescriptcompiler-warningsunreachable-code

解决方案


您是否尝试过函数重载:

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

推荐阅读