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

TypeScript中如何为创建实例的柯里化函数定义正确类型

解决方案

你当前代码返回类型推导为any的核心原因是构造函数参数的返回值被硬编码成了any,只要引入泛型捕获传入构造函数的实例类型,就能实现自动推导,修改后的代码如下:

export const errorBuilder = <TError extends Error>(
  builder: new (message: string) => TError
) => (error: unknown): TError => {
  return new builder(getErrorMessage(error))
}

类型逻辑说明

  • 泛型参数TError被约束为Error的子类,既兼容原生Error构造函数,也支持所有符合「接收单个字符串message参数构造实例」规则的自定义错误类(比如你的ServiceError、表单验证错误类)
  • TS会根据你传入errorBuilder的构造函数自动推导TError的具体类型,不需要手动给返回的错误构造函数加类型标注

效果验证

传入ServiceError时的推导结果完全符合预期:

class ServiceError extends Error {
  constructor(message: string) {
    super(message)
    this.name = 'ServiceError'
  }
}

// createErrorService 自动推导类型为 (error: unknown) => ServiceError
export const createErrorService = errorBuilder(ServiceError)

// 其他场景同理,比如表单验证错误
class ValidationError extends Error {}
export const createValidationError = errorBuilder(ValidationError)
// 推导类型为 (error: unknown) => ValidationError

如果你的自定义错误构造函数支持额外可选参数,这个类型签名也能正常兼容,不会报类型错误。

内容的提问来源于stack exchange,提问作者ValRob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:00:57