TypeScript中能否获取运算符(如===)的可调用引用?
在TypeScript中能否获取
===这类运算符的可调用引用? 问题背景
我写了一个数组去重函数,通过传入自定义的相等判断逻辑来移除重复项:
function dedup<T>(values: T[], equals: (a: T, b: T) => boolean): T[] { return values.reduce<T[]>((prev, cur) => { if (prev.filter((value) => equals(value, cur)).length == 0) prev.push(cur); return prev; }, []); }
但当我只想用===做全等判断时,每次都得写冗余的匿名函数:
dedup([1, 2, 3, 2], (a, b) => a === b)
我希望能直接像dedup([1, 2, 3, 2], ===)这样调用,但不知道怎么获取这类运算符的可调用引用。
解决方案
TypeScript(以及JavaScript)里无法直接获取===这类内置运算符的可调用引用,因为它们是语言语法层面的运算符,并非独立的函数对象。不过可以通过两种方式简化调用:
封装通用全等判断函数
提前定义一个复用的全等判断函数,之后直接传入即可:const strictEqual = <T>(a: T, b: T): boolean => a === b;调用示例:
dedup([1, 2, 3, 2], strictEqual);给
dedup添加默认参数/函数重载
修改原函数,让它在未传入相等判断函数时,默认使用===逻辑,这样调用时可以省略第二个参数:// 函数重载:支持两种调用方式 function dedup<T>(values: T[]): T[]; function dedup<T>(values: T[], equals: (a: T, b: T) => boolean): T[]; function dedup<T>(values: T[], equals?: (a: T, b: T) => boolean): T[] { // 默认使用全等判断 const defaultEquals = (a: T, b: T) => a === b; const eq = equals ?? defaultEquals; // 优化:用some替代filter.length,提升性能 return values.reduce<T[]>((prev, cur) => { if (!prev.some(value => eq(value, cur))) prev.push(cur); return prev; }, []); }调用示例:
// 默认用===去重 dedup([1, 2, 3, 2]); // 自定义相等逻辑时仍可传参 dedup([{id:1}, {id:2}, {id:1}], (a, b) => a.id === b.id);
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

