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
相关产品推荐
相关产品推荐

