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

TypeScript嵌套泛型箭头函数类型的正确语法?泛型对称律实现疑问

为泛型数组创建通用对称律的TypeScript实现

你已经定义了对称律的通用类型:

type SymmetryLaw<T> = (f: (x: T, y: T) => T, x: T, y: T) => boolean;

并实现了针对number和number[]的对称律检查:

const num_op_symmetry: SymmetryLaw<number> = (f, x, y) =>
  f(x, y) === f(y, x);

const array_op_symmetry: SymmetryLaw<number[]> = (f, x, y) =>
  f(x, y) === f(y, x);

直接写SymmetryLaw<Array<T>>会报错,因为TypeScript无法识别未声明的泛型参数T。要实现适用于任意类型数组的泛型对称律,需要给函数本身添加泛型参数,具体实现如下:

正确的泛型实现方式

// 方式1:直接定义泛型函数,符合SymmetryLaw<T[]>的类型约束
const array_symmetry = <T>(f: (x: T[], y: T[]) => T[], x: T[], y: T[]): boolean => {
  // 数组是引用类型,不能直接用===判断内容相等,这里实现浅比较逻辑
  const areArraysEqual = (a: T[], b: T[]): boolean => {
    if (a.length !== b.length) return false;
    return a.every((val, index) => val === b[index]);
  };
  return areArraysEqual(f(x, y), f(y, x));
};

// 方式2:返回符合SymmetryLaw<T[]>类型的函数,更贴合原类型定义
const array_symmetry = <T>(): SymmetryLaw<T[]> => {
  const areArraysEqual = (a: T[], b: T[]): boolean => {
    if (a.length !== b.length) return false;
    return a.every((val, index) => val === b[index]);
  };
  return (f, x, y) => areArraysEqual(f(x, y), f(y, x));
};

关键说明

  • 必须显式声明泛型参数<T>,让TypeScript能够推断数组元素的类型,从而适配任意类型的数组。
  • 数组是引用类型,===仅判断引用地址是否相同,无法检查内容一致性,因此需要额外实现数组的相等性判断逻辑(上述示例为浅比较,若数组元素是复杂对象,需改为深比较)。

内容的提问来源于stack exchange,提问作者stu002

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:13:29