修复打字稿中的strictBindCallApply相关错误

时间:2019-03-30 18:44:18

标签: angular typescript handsontable

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

  

src / app / hot / hot.component.ts(538,61)中的错误:错误TS2345:类型'IArguments'的参数不能分配给类型'[Core,HTMLTableCellElement,number,number,string |数字,任意,CellProperties]”。
  类型'IArguments'缺少类型'[Core,HTMLTableCellElement,number,number,string |数字,任意,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 个答案:

答案 0 :(得分:1)

strictBindCallApply:trueapply调用启用严格类型检查,这就是导致错误的原因。 arguments的类型不是打字稿希望在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);

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