TypeScript中NumFunc无法赋值给UnknownFunc的报错原因咨询
为何将接收number的函数赋值给接收unknown的函数会报错?
代码示例
type NumFunc = (data: number) => void; type UnknownFunc = (data: unknown) => void; declare let numFunc: NumFunc; let unknownFunc: UnknownFunc = numFunc; // 此处报错
错误信息
Type 'NumFunc' is not assignable to type 'UnknownFunc'.
Types of parameters 'data' and 'data' are incompatible.
Type 'unknown' is not assignable to type 'number'.
原因解释
这个报错的核心是TypeScript对函数参数类型的逆变兼容性规则。
当你把numFunc赋值给unknownFunc时,相当于声明unknownFunc可以接收任意unknown类型的参数(比如字符串、布尔值都能传入)。但numFunc本身只能处理number类型的参数,如果强行赋值,后续调用unknownFunc("abc")时,实际执行的是numFunc("abc")——这就会把字符串传给只接受number的函数,必然导致运行时错误。
TypeScript为了提前规避这种风险,会严格检查函数赋值的兼容性:要让函数A能赋值给函数B,A的参数类型必须能覆盖B的参数类型的所有可能输入。换句话说,B的参数类型必须是A的参数类型的子类型(A能接受的参数范围要比B更大)。
在这个例子里,unknown是所有类型的超类型,number是unknown的子类型。UnknownFunc的参数类型范围比NumFunc大得多,不符合逆变要求,因此TypeScript直接抛出错误,阻止你做出这种不安全的赋值。
内容的提问来源于stack exchange,提问作者Yimin
相关产品推荐
相关产品推荐

