当代码路径无法到达时,抑制 "并非所有路径都返回一个值 "的Typescript警告

问题描述 投票:0回答:1

我有一个函数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
    }

}

我可以这样做吗?我还能做什么?我可以返回一些类型为never的东西,也许可以,但我如何让一个never的 "值 "返回?

typescript compiler-warnings unreachable-code
1个回答
1
投票

你有没有试过函数重载。

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;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.