假设您正在 Excel 365 中编写 Office 脚本,并且想要使用以下常见模式:
const isUpperCase = (str: string) => str.toUpperCase() === str
const texts = workbook.getActiveWorksheet().getUsedRange(true).getTexts()
const rowsContainingUpperCase = texts.find((row) => row.some(isUpperCase))
最后一行给出警告:
const rowsContainingUpperCase = texts.find((row) => row.some(isUpperCase))
// ^^^^^^^^^^^
// Only arrow functions may be used in array method callbacks. (Office Scripts Error)
这看起来像是一个可以忽略的 linter 错误,但是在尝试运行脚本时,它无法运行,您会得到以下结果:
参见第 3 行,第 62 列:在数组方法回调中只能使用箭头函数。
Microsoft 在 Office 脚本中的 TypeScript 限制中记录了这一点:
您的脚本在为数组方法提供回调参数时只能使用箭头函数。您不能将任何类型的标识符或“传统”函数传递给这些方法。
它也将其称为“编译器错误”,但它没有解释为什么这是一个编译器错误,也没有明确指出没有办法抑制它。
有办法抑制错误吗?或者你总是需要重构
row.some((x) => isUpperCase(x))
?
您链接到的文档是正确的:将这样的变量传递给数组回调是 Office 脚本中的编译器错误。这不是一个短绒警告。解决方法是在回调中包含案例评估逻辑:
const texts = workbook.getActiveWorksheet().getUsedRange(true).getTexts();
const rowsContainingUpperCase = texts.find((row) => row.some((str: string) => str.toUpperCase() === str));
至于“为什么”这是一个编译器错误,它与 Office 脚本在运行之前从同步代码转换为异步代码的方式有关。我会尝试让产品团队的人员在这里提供更多详细信息,但是像这样的 TypeScript 限制可以有效地添加,以通过消除边缘情况来提高性能。
此外,就其价值而言,此问题中的行查找逻辑不会包含重复项。不确定这是否重要,但这是我注意到的。