为何无法将任意函数赋值给'(...args: unknown[]) => unknown'类型?
为什么sum函数无法赋值给f2?
这本质是TypeScript中函数类型的参数逆变规则,结合any和unknown的类型特性导致的:
f1能正常赋值的原因
f1的类型是(...args: any[]) => unknown:
any是TypeScript里最宽松的类型,它可以兼容任何类型(包括number)。当把sum赋值给f1时,TypeScript认为调用f1传入的any类型参数,完全可以被sum的number参数接收,所以不会触发类型错误。
f2无法赋值的核心原因
f2的类型是(...args: unknown[]) => unknown:
unknown是类型安全的“任意类型”,它和any的核心区别是:unknown类型的值不能直接赋值给其他具体类型(比如number),必须先经过类型断言或类型缩小操作。- 当你尝试把
sum赋值给f2时,TypeScript会假设未来调用f2时可能传入unknown类型的参数,但sum的参数a和b明确要求是number,unknown无法直接转换为number,这违反了TypeScript的类型安全原则,因此会抛出错误。
代码示例回顾
function sum(a: number, b: number): number { return a + b; } const f1: (...args: any[]) => unknown = sum // Okay const f2: (...args: unknown[]) => unknown = sum // Not okay
对应的报错信息清晰指出了冲突点:
Type '(a: number, b: number) => number' is not assignable to type '(...args: unknown[]) => unknown'.
Types of parameters 'a' and 'args' are incompatible.
Type 'unknown' is not assignable to type 'number'.
简单总结:any可以“无条件兼容”number,但unknown不行——它需要明确的类型确认才能转换为具体类型,TypeScript不允许这种潜在的不安全赋值。
内容的提问来源于stack exchange,提问作者Hazel
相关产品推荐
相关产品推荐

