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

为何无法将任意函数赋值给'(...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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:15:23