
TypeScript(及 JavaScript)不支持直接将运算符(如 ===、+、>)作为一等函数引用传递;但可通过预定义高阶函数(如 isIdentical)实现语义等价、类型安全且简洁的替代方案。
typescript(及 javascript)不支持直接将运算符(如 `===`、`+`、`>`)作为一等函数引用传递;但可通过预定义高阶函数(如 `isidentical`)实现语义等价、类型安全且简洁的替代方案。
在 TypeScript 开发中,我们常需将比较逻辑作为参数传入通用工具函数(例如去重、查找、分组等)。以 dedup<t></t> 函数为例:
function dedup<t>(values: T[], equals: (a: T, b: T) => boolean): T[] {
return values.reduce<t>((prev, cur) => {
if (!prev.some(value => equals(value, cur))) {
prev.push(cur);
}
return prev;
}, []);
}</t></t>
该函数通过传入的 equals 回调判断元素是否重复。若使用严格相等(===),当前必须写成冗余的箭头函数:
dedup([1, 2, 3, 2], (a, b) => a === b); // ✅ 可行,但不够简洁
遗憾的是,JavaScript 和 TypeScript 均不支持 === 运算符本身作为可调用值——它不是函数,无法被引用或传递(类似 +、!= 等所有运算符同理)。因此 dedup([1, 2, 3, 2], ===) 是语法错误,无法编译。
✅ 正确且推荐的解决方案是:显式封装为具名、类型安全的工具函数,例如:
// 类型安全的严格相等判断器
const isIdentical = <t>(a: T, b: T): boolean => a === b;
// 使用示例
dedup([1, 2, 3, 2], isIdentical); // ✅ 清晰、复用性强、支持泛型推导
dedup(['a', 'b', 'a'], isIdentical); // ✅ 字符串同样适用
dedup([{id: 1}, {id: 1}], isIdentical); // ⚠️ 注意:对象引用比较,非深相等</t>
? 进阶建议:
- 若需支持
null/undefined安全比较,可扩展为const isStrictlyEqual = (a: unknown, b: unknown) => a === b,兼顾类型宽松性; - 对于深比较等复杂场景,应单独引入
lodash.isEqual或自定义deepEquals,而非强行“模拟”运算符; - 可将常用比较器集中导出为工具模块(如
comparators.ts),提升项目一致性与可维护性。
总结:虽然无法“直接引用运算符”,但通过轻量封装,我们既能保持代码简洁性与可读性,又能获得完整的类型检查、IDE 支持和复用能力——这正是 TypeScript 工程实践中的惯用范式。











