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

时间:2019-08-05 10:55:46

标签: typescript

请考虑以下示例:(在严格空检查中)模式

const fn: (p: { x: number } | null) => void = (p: { x: number }) => console.log(p.x);
fn(null);

这段代码在打字稿中不会产生任何错误,但是有一个运行时类型异常。

在我看来,像Typescript一样应该强制实施目标参数类型(此处为{x: number } | null)才能分配给源参数类型(此处为{ x: number }),以便例如在不传递null的情况下将其传递给预期会有其他情况并导致错误。

这为什么不强制执行?那是打字稿中的错误吗?还是我缺少的配置中的某些内容?

1 个答案:

答案 0 :(得分:1)

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

如果启用strictFunctionTypes,则参数将互相关,这意味着仅当目标参数是源参数的子类型时,分配才会成功。这将产生一个错误,因为{ x: number } | null不是{ x: number }的子类型

启用strictFunctionTypes,您将得到一个错误。您也可以在操场上看到以下行为:with the optionwithout the option