为何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
相关产品推荐
相关产品推荐

