TypeScript中为何该函数类型无法正确解析?泛型报错咨询
TypeScript泛型类型不兼容错误原因分析
先看你提供的代码:
type OnlyFunction<T> = T extends (...a: any[]) => any ? T : never; function t1<T extends (...a: any[]) => any>(p: OnlyFunction<T>): ReturnType<T> { return p(); } function t2<T extends (...a: any[]) => any>(): ReturnType<T> { return t1<T>(() => "ok"); // Error Argument of type '() => string' is not assignable to parameter of type 'OnlyFunction<T>'. }
错误原因拆解:
- 泛型参数的开放性:
t2的泛型T是由调用者指定的任意函数类型,只要符合(...a: any[]) => any的约束即可。比如调用t2<() => number>()时,T就是() => number;调用t2<(x: string) => boolean>()时,T就是(x: string) => boolean。 OnlyFunction<T>的实际作用:因为T已经被约束为函数类型,所以OnlyFunction<T>等价于T本身,这个类型别名并没有额外的过滤效果。- 类型不匹配的必然性:你在
t2内部硬传入了固定的() => string函数给t1<T>,但T是任意的函数类型,无法保证这个固定函数和T的类型一致。比如当T是() => number时,() => string显然不能赋值给T,TypeScript会在编译阶段识别到这种潜在错误,因此抛出报错。
简单来说,你不能用具体的函数类型去匹配任意的泛型函数类型参数,因为泛型参数的类型由外部决定,内部无法提前确保它和你传入的具体类型兼容。
内容的提问来源于stack exchange,提问作者doox
相关产品推荐
相关产品推荐

