如何为接收联合类型参数的泛型函数正确标注类型?
问题原因
你遇到的问题核心是:AB 是两种数组类型的联合(A[] | B[]),而你的泛型函数 randomGenericFunction 中 param2 的类型被定义为 T[]——这要求传入的是单一元素类型的数组,而非数组类型的联合。TypeScript 类型推断会优先尝试匹配第一个兼容的单一类型(这里是 A),但 B[] 无法赋值给 A[],因此抛出错误。
解决方案
根据你的业务需求,有两种常见的处理方式:
方式一:让泛型函数接受数组类型的联合
直接调整泛型约束,让 T 代表数组类型而非数组元素类型,这样可以直接兼容 A[] | B[]:
export const randomGenericFunction = <O, T extends Record<string, unknown>[]>( param1: O, param2: T ) => { const d = param2.map(p => p) // ... 你的业务逻辑 } // 调用时无报错 randomGenericFunction('param1', data)
此时 TypeScript 会将 T 推断为 A[] | B[],完全匹配 data 的类型。
方式二:手动指定泛型参数为联合元素类型
如果你希望保持 T 代表数组元素类型,可以手动将 T 指定为 A | B,此时 T[](即 (A | B)[])可以兼容 A[] | B[](因为纯 A 数组或纯 B 数组都是混合数组的子类型):
// 手动指定泛型参数 randomGenericFunction<string, A | B>('param1', data)
这种方式下,函数内部的 param2 元素会被推断为 A | B,你可以通过类型守卫处理不同类型的逻辑。
额外说明:区分 A[] | B[] 和 (A | B)[]
注意这两种类型的差异:
A[] | B[]:数组中的元素要么全是A,要么全是B(A | B)[]:数组中可以混合存在A和B类型的元素
根据你的实际业务场景选择对应的类型定义,如果允许混合元素,也可以直接将AB改为(A | B)[],这样无需修改泛型函数即可正常调用。
内容的提问来源于stack exchange,提问作者Person
相关产品推荐
相关产品推荐

