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
相关产品推荐
相关产品推荐

