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

为何在泛型函数中需将输入类型设为never而非unknown?

为什么用never作为函数参数类型比unknown更适合表示任意单参数函数?

当你尝试用(input: unknown) => unknown表示“接受单个参数的任意函数”时,会遇到类型不兼容错误,而换成(input: never) => unknown就可以正常工作,核心原因在于TypeScript中函数参数类型的逆变特性,以及never和unknown的类型定位差异:

1. 函数参数的逆变规则

TypeScript中,函数类型的子类型关系与参数类型的子类型关系是相反的(逆变):

  • 如果类型A是类型B的子类型,那么(input: B) => any是(input: A) => any的子类型。
  • 换句话说:参数类型越宽泛,函数类型的兼容性越窄;参数类型越严格(越窄),函数类型的兼容性越宽。

要让一个类型能兼容所有单参数函数,它的参数类型必须是所有可能参数类型的子类型——这样任何单参数函数都能安全地赋值给它。

2. never是所有类型的子类型(底部类型)

never是TypeScript的底部类型,它是所有其他类型的子类型,没有任何值属于never类型:

  • 对于任意单参数函数(input: T) => R,由于never extends T(never是T的子类型),根据逆变规则,(input: T) => R可以赋值给(input: never) => unknown。
  • 同时,(input: never) => unknown类型的函数无法被调用(因为没有合法的never类型参数可以传入),这刚好匹配我们只需要表示“任意单参数函数”而不需要调用它的场景——从根源上避免了调用时的类型安全问题。

3. unknown是所有类型的超类型(顶部类型)

unknown是TypeScript的顶部类型,它是所有其他类型的超类型,任何值都可以赋值给unknown类型:

  • 当你用(input: unknown) => unknown作为目标类型时,只有接受unknown参数的函数才能赋值给它。比如(input: number) => string无法赋值,因为如果调用(input: unknown) => unknown类型的函数时,可能传入string等非number类型的值,而原函数只接受number,这会导致类型不安全,因此TypeScript会抛出Type 'unknown' is not assignable to type 'number'的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:22:52