TypeScript中基于默认值推断函数参数类型报错原因咨询
TypeScript类型推断错误原因解析
核心矛盾:泛型函数要求 vs 传入函数的实际类型
1. func对参数函数的要求
func接收的参数是一个泛型函数,签名为 <T extends Record<string, any>>(state: T) => T。这个函数必须满足:
- 能接受任意符合
Record<string, any>约束的类型T作为输入; - 返回值类型必须和输入的
T严格一致,也就是“输入什么类型,输出什么类型”。
2. 你传入的函数的实际类型
你写的(state = variable) => state,TypeScript会自动推断为非泛型函数:(state?: Foo) => Foo。这个函数的局限性很明显:
- 不传参数时,用默认值
variable(类型Foo),返回Foo; - 传参数时,参数只能是
Foo或其子类型,返回值也固定是Foo。
3. 报错的根本原因
func要求的泛型函数需要适配所有合法的T,但你传入的函数只能处理Foo相关类型。比如如果给这个传入的函数传一个{bar: "a", extra: 123}类型的参数,它的返回值依然是Foo,这就违反了泛型函数“输入输出同类型”的要求。
TypeScript抛出的Type 'Foo' is not assignable to type 'T'错误,本质是:泛型T是可变的(可以是任意符合约束的类型),但你的函数只能返回固定的Foo类型,无法保证对所有T都满足T => T的约束。
修复方案
要让传入的函数符合func的要求,需要把它定义为泛型函数,同时让默认值适配泛型T:
type Foo = { bar: string } const variable: Foo = { bar: "string..." } const func = (arg: <T extends Record<string, any>>(state: T) => T) => arg // 修复后的调用 const result = func(<T extends Foo>(state: T = variable as T) => state)
这里通过T extends Foo缩小泛型范围,并用variable as T让默认值适配任意Foo的子类型T,确保输入和输出始终为同一类型T。
内容的提问来源于stack exchange,提问作者johann1301s
相关产品推荐
相关产品推荐

