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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:16:23