修复 typescript 中的 strictBindCallApply 相关错误

Posted

技术标签:

【中文标题】修复 typescript 中的 strictBindCallApply 相关错误【英文标题】:fixing strictBindCallApply related error in typescript 【发布时间】:2019-08-21 09:49:50 【问题描述】:

当我在tsconfig.json 中添加strictBindCallApply:true 并运行ng build 时,我得到以下信息:

src/app/hot/hot.component.ts(538,61) 中的错误:错误 TS2345:“IArguments”类型的参数不可分配给“[Core, htmlTableCellElement, number, number, string | number, any, CellProperties]'。 类型“IArguments”缺少类型“[Core, HTMLTableCellElement, number, number, string | number, any, CellProperties]': 0, 1, 2, 3, 还有 32 个。

相关代码部分如下:

const cellValidationTempVar = this.cellValidation;
this.cellValidation[i].renderer = function (instance, td, row, col, prop, value, cellProperties) 
  Handsontable.renderers.TextRenderer.apply(this, arguments); // HERE!
  if (instance.getDataAtCell(row, col).length > cellValidationTempVar[col].length ) 
    td.classList.add('htInvalid');
   else 
    td.classList.remove('htInvalid');
  

Handsontable.renderers.TextRenderer.apply(this, arguments); 语句与documentation 中使用的语句相同。

我正在使用:

Angular 7.2 掌上电脑 7.0.0 打字稿 3.2.4

没有strictBindCallApply,构建工作正常。

【问题讨论】:

【参考方案1】:

strictBindCallApply:true 启用对apply 调用的严格类型检查,这就是它导致错误的原因。 arguments 的类型不是 typescript 期望在 apply 调用中获得的类型。文档中的示例是一个 javascript 示例,其中没有类型检查,这就是它可以正常工作的原因。

您可以通过显式指定参数而不是使用arguments object 来防止错误。这是更新的代码:

const cellValidationTempVar = this.cellValidation;
this.cellValidation[i].renderer = function (instance, td, row, col, prop, value, cellProperties) 
  Handsontable.renderers.TextRenderer.apply(this, [instance, td, row, col, prop, value, cellProperties]); // HERE!
  if (instance.getDataAtCell(row, col).length > cellValidationTempVar[col].length ) 
    td.classList.add('htInvalid');
   else 
    td.classList.remove('htInvalid');
  

这不是那么优雅,但它可以防止类型错误。

另一种选择是通过转换为 any 来指定忽略类型,因此它就像 javascript 代码一样。

Handsontable.default.renderers.TextRenderer.apply(this, arguments as any);

如果您想要类型检查,我认为第一种方法是更好的方法。

【讨论】:

以上是关于修复 typescript 中的 strictBindCallApply 相关错误的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 typeScript 中的“对象”类型上不存在“属性”拨号

如何修复'Typescript“正在进行类型检查......”花费太长时间'?

React+Typescript:修复 UseEffect Hook(回调+清理函数错误)

typescript eventTarget dataset 如何修复报错?

TypeScript:覆盖和修复包的类型定义

Typescript 中的枚举类型是啥?