You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义返回类型为never的方法并实现正确的类型收窄?

如何定义返回类型为never的方法并实现正确的类型收窄?

我懂你遇到的问题了!你写了一个返回never类型的工具函数,然后把它封装到对象的方法里,结果调用这个方法后,TypeScript并没有正确识别后续代码是不可达的,类型收窄没生效对吧?

先看看你写的代码:

function logAndThrow(msg: string): never {
  console.log("Foo");
  throw new Error(msg);
}

const thrower = {
  fooNotFound: (): never => {
    logAndThrow("foo not found");
  },
};

比如在下面这个函数里,调用thrower.fooNotFound()之后,TypeScript没把foo的类型正确收窄成number:

function doSomething(foo?: number): number {
  if (!foo) {
    thrower.fooNotFound();
  }
  // 这里TS可能还认为foo是number | undefined,没法直接返回
  return foo;
}

其实问题出在TypeScript对对象字面量里箭头函数的类型推断上,虽然你标注了: never,但TS有时候没法完全确认这个方法真的永远不会返回。咱们试试这两种解决办法:

办法一:显式返回never类型的函数结果

给箭头函数加上return,把logAndThrow的返回值(也就是never)明确返回出去,这样TS就能清晰识别这个方法的返回类型:

const thrower = {
  fooNotFound: (): never => {
    return logAndThrow("foo not found"); // 加上return关联never类型
  },
};

办法二:给对象定义明确的类型

提前给thrower对象定义一个类型,强制TS把方法的类型认定为() => never,这样就不会出现推断偏差:

type Thrower = {
  fooNotFound: () => never;
};

const thrower: Thrower = {
  fooNotFound: () => {
    logAndThrow("foo not found");
  },
};

修改后再看doSomething函数,TS就能正确识别thrower.fooNotFound()之后的代码是不可达的,自动把foo的类型收窄成number:

function doSomething(foo?: number): number {
  if (!foo) {
    thrower.fooNotFound();
  }
  // 现在TS会确认foo是number,可以直接返回
  return foo;
}

核心就是让TypeScript明确知道这个方法确实是返回never类型,要么通过显式返回关联已有never函数,要么给对象定义明确类型,这样类型收窄就能正常工作啦。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:04:30