You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)里无法直接获取===这类内置运算符的可调用引用,因为它们是语言语法层面的运算符,并非独立的函数对象。不过可以通过两种方式简化调用:

  1. 封装通用全等判断函数
    提前定义一个复用的全等判断函数,之后直接传入即可:

    const strictEqual = <T>(a: T, b: T): boolean => a === b;
    

    调用示例:

    dedup([1, 2, 3, 2], strictEqual);
    
  2. 给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:17:06