【问题标题】:Suppressing the "not all paths return a value" Typescript warning when a code path is unreachable当代码路径无法访问时,抑制“并非所有路径都返回值”Typescript 警告
【发布时间】:2020-08-20 00:36:32
【问题描述】:

我有一个函数 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,也许,但我如何获得一个从不返回的“值”?

【问题讨论】:

  • 我不明白一个函数如何永远无法返回。我的意思是,它可以返回 void 或一个永不重复但同步功能的承诺?
  • ChristophLütjen 有 2 种同步函数不返回的情况:异常或无限循环。
  • 并非一切都是 node.js :) 这是 Rhino。 Foobar 暂停执行(this的实现确实涉及异常),并通过调用另一个函数重新启动它

标签: typescript compiler-warnings unreachable-code


【解决方案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;
  }
}

【讨论】:

  • 哦。我可以对一个值进行函数重载,而不仅仅是一个类型?不知道那个。应该这样做....
  • @TheArchetypalPaul 我的理解是字符串文字是一种特殊的类型:typescriptlang.org/docs/handbook/…
  • 啊,很遗憾,我为了简单起见稍微撒谎了。实际上,参数是一个对象(无论是否为空)。无论如何都有接受的答案,您确实按照所述回答了问题,我仍然可以以某种方式使用您的方法
  • @TheArchetypalPaul 添加了更新,但不确定它是否与您的用例匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 2013-04-08
  • 2014-12-06
相关资源
最近更新 更多