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

为何func1可正常运行而func2报TypeScript类型不兼容错误?

为什么func2会报“function argument is not assignable”错误?

先看你的代码:

type AnyObj = Record<string, any>;
type Data = { a: number; b: string };
type DataFunction = (arg: AnyObj) => any;

const func1: DataFunction = () => {};
const arg1: Data = {} as any; 
func1(arg1); // 运行正常

const func2 = (arg: { func: DataFunction }) => {};
const arg2: { func: (arg: Data) => { } } = {} as any; 
func2(arg2); // 报错

核心原因:函数类型兼容性的逆变规则

TypeScript判断函数类型能否赋值时,遵循「参数逆变、返回值协变」的逻辑:

  • 函数调用场景:实参可以是形参类型的子类型(协变),这就是func1(arg1)能正常运行的原因——Data是AnyObj的子类型,传给接受AnyObj的函数完全安全。
  • 函数类型赋值场景:如果目标函数要求接受类型T的参数,源函数的参数类型必须是T的超类型(更宽泛),这样源函数才能处理所有T类型的输入。

具体到你的代码:

  • DataFunction定义的函数需要能接受任意AnyObj类型的参数(比如{c: boolean}这种和Data完全无关的对象)。
  • 但arg2.func的参数是Data类型,它只能处理符合Data结构的输入。如果func2内部调用arg.func时传入一个非Data的AnyObj,arg2.func就会收到不符合预期的参数,这是不安全的。

因此TypeScript会阻止这种不安全的赋值,抛出类型不兼容的错误。

内容的提问来源于stack exchange,提问作者user5480949

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:42:02