问题的背景:
JavaScript 允许使用 bind、call 和 apply 方法来传递上下文(this)和参数。在 TypeScript 3.2 出现之前,这些方法的使用较为宽松:在其参数中常常允许多余或不正确的值,这会导致运行时错误。TypeScript 实现了 strictBindCallApply 参数,增加了对这些方法的签名的严格检查。
问题:
在没有严格类型的情况下,bind/call/apply 方法允许 "容忍" 多余、缺失或类型不匹配的参数,而不会在编译阶段产生任何错误。
解决方案:
启用 strictBindCallApply 后,TypeScript 编译器严格要求:
代码示例:
function sum(a: number, b: number): number { return a + b; } const sum2 = sum.bind(null, 1); sum2(2); // OK sum2(2, 3); // 在 strictBindCallApply 中出错
关键特点:
strictBindCallApply 仅适用于函数,还是也影响类的方法?
它影响函数和方法,因为 bind/call/apply 方法可用于任何函数(Function.prototype)。这既适用于独立函数,也适用于类的方法。
strictBindCallApply 参数可以在不启用 strict 模式下开启吗?
不可以,启用它需要 strict=true 或在 tsconfig.json 中直接指定 strictBindCallApply=true。
如果通过 bind 传递的参数数量超过原始函数定义的数量,会发生什么?
在启用 strictBindCallApply 的情况下,TypeScript 编译器将发出错误:“Expected X arguments, but got Y”。这可以防止常见的参数签名延长或意外捕获多余变量的错误。
消极案例 开发人员使用 .bind 来部分应用参数,但参数数量出错。在正常模式下没有错误,但在生产中函数被调用时传递了多余参数,导致逻辑中断。
优点:
缺点:
积极案例 启用了 strictBindCallApply,函数和方法严格按照签名使用 bind:多余或不正确的参数在编译阶段被排除。
优点:
缺点: