TS2322错误解析:泛型返回类型继承BaseResponse时的报错原因
理解TypeScript中TS2322错误的原因
先看你贴的代码:
type BaseResponse = { a : number; } type ExtendedResponse = BaseResponse & { b: string; } type Fn = <T extends BaseResponse>() => T type A = { fn : Fn; } const arr : A[] = [{ fn : () => { // Error in this case return { a: 4 } } }, { fn: () => { // Error in that case too return { a: 5, b: 'hello' } } }]
编译器给出的错误信息翻译过来是:
'{ a: number; }' 可以赋值给类型T的约束,但T可以被实例化为约束BaseResponse的不同子类型
错误原因拆解
你定义的Fn是一个泛型函数类型:<T extends BaseResponse>() => T,它的核心要求是:这个函数必须能返回调用者指定的任意T类型(只要T是BaseResponse的子类型),而不是返回一个固定的、符合BaseResponse的对象。
举个实际场景的矛盾点:
- 如果有人调用第一个
fn时指定fn<ExtendedResponse>(),按照泛型约定,函数应该返回带b属性的对象,但你的函数只能返回{a:4},完全不符合要求。 - 第二个
fn返回带b的对象,但如果调用时指定fn<BaseResponse>(),按照约定应该返回仅包含a的对象,你的返回多了b——虽然类型兼容,但泛型函数要求返回的是精确匹配的T类型,而非T的超类型。
TypeScript的类型检查器察觉到了这个矛盾:你写的函数无法满足泛型函数“适配任意子类型T”的承诺,因此抛出TS2322错误。
简单解决思路
如果你的场景不需要让调用者指定返回类型,只是要返回符合BaseResponse的对象,直接把Fn改成非泛型类型即可:
type Fn = () => BaseResponse;
这样两个函数的返回值都符合要求,错误会自动消失。
内容的提问来源于stack exchange,提问作者fZab
相关产品推荐
相关产品推荐

