PAYATHON 2026

Angular control-flow migration 为何给 trackByFn 传两个参数?

数据阿明

结论

从给出的代码可以看出,迁移后的模板调用了 trackByFn(index, item),而函数只声明了一个参数,因此出现 TS2554。这些信息不足以判断 Angular 是否将此情况认定为迁移器 bug,但生成的代码需要与当前函数签名兼容。

为什么会出现 TS2554

在原模板中,trackBy 函数作为回调传给 *ngFor。迁移后,代码改为在 @for 的 track 表达式中直接调用函数:

@for (item of data; track trackByFn(index, item); let index = $index) {
}

调用时传入了两个实参,函数却只接受一个:

trackByFn(index: number): number {
  return index;
}

因此,TypeScript 检查这个调用时会报 TS2554: Expected 1 arguments, but got 2.。问题中提到的两种修复方式都能对应这个参数不匹配:模板只传 index,或让函数声明接收第二个参数。

修复方式

如果函数只需要索引,可以保留现有签名,并修改模板,让它只传入索引:

@for (item of data; track trackByFn(index); let index = $index) {
}

如果函数还需要当前项,可以为函数声明第二个参数,并使用项目中的实际数据类型:

trackByFn(index: number, item: YourItemType): number {
  return index;
}

将 YourItemType 替换为 data 中元素的真实类型。如果函数不使用 item,也可以在函数体中忽略它。

如何判断是否属于迁移器问题

迁移后的调用传入两个参数,而现有函数只声明一个参数,这说明生成的代码与项目中的类型定义不匹配。仅凭这一点,无法证明迁移器违反了预期行为,也无法确认官方是否已将其认定为 bug。要判断这一点,还需要查阅相应 Angular 版本的迁移说明或相关 issue;目前给出的材料没有提供这些依据。

备注:内容仅供参考。