请考虑以下示例:(在严格空检查中)模式
const fn: (p: { x: number } | null) => void = (p: { x: number }) => console.log(p.x);
fn(null);
这段代码在打字稿中不会产生任何错误,但是有一个运行时类型异常。
在我看来,像Typescript一样应该强制实施目标参数类型(此处为{x: number } | null
)才能分配给源参数类型(此处为{ x: number }
),以便例如在不传递null的情况下将其传递给预期会有其他情况并导致错误。
这为什么不强制执行?那是打字稿中的错误吗?还是我缺少的配置中的某些内容?
答案 0 :(得分:1)
默认情况下,函数参数是双变量相关的。这意味着,如果目标参数是源参数的子类型,或者反之亦然,则该函数是可分配的(这就是为什么成功的原因,因为{ x: number }
是{ x: number } | null
的子类型
如果启用strictFunctionTypes
,则参数将互相关,这意味着仅当目标参数是源参数的子类型时,分配才会成功。这将产生一个错误,因为{ x: number } | null
不是{ x: number }
的子类型
启用strictFunctionTypes
,您将得到一个错误。您也可以在操场上看到以下行为:with the option和without the option