TypeScript:函数是可分配的,但如果目标参数类型不可分配给源参数类型,则会产生错误

TypeScript:函数是可分配的,但如果目标参数类型不可分配给源参数类型,则会产生错误,typescript,Typescript,考虑以下示例:在严格的空检查模式下 const fn: (p: { x: number } | null) => void = (p: { x: number }) => console.log(p.x); fn(null); 此代码在typescript中不产生错误,但存在运行时类型异常 在我看来,Typescript应该在这里强制目标参数类型{x:number}| null可分配给源参数类型{x:number},这样,例如,null就不会在预期的地方传递,并导致错误 为什么这不

考虑以下示例:在严格的空检查模式下

const fn: (p: { x: number } | null) => void = (p: { x: number }) => console.log(p.x);
fn(null);
此代码在typescript中不产生错误,但存在运行时类型异常

在我看来,Typescript应该在这里强制目标参数类型{x:number}| null可分配给源参数类型{x:number},这样,例如,null就不会在预期的地方传递,并导致错误


为什么这不强制执行呢?这是打字脚本中的错误吗?或者配置中我缺少的东西?

默认情况下,函数参数的关系是双变量的。这意味着如果函数是可赋值的,如果目标参数是源参数的子类型,或者反之亦然,这就是为什么会成功,因为{x:number}是{x:number}null的子类型

如果启用strictFunctionTypes,则参数将反向关联,这将意味着仅当目标参数是源参数的子类型时,赋值才会成功。这将在此处产生错误,因为{x:number}null不是{x:number}的子类型


启用strictFunctionTypes,您将得到一个错误。你也可以在操场上看到这种行为:而且

你的代码在Typescript中出现了一个错误