TypeScript如何实现接收纯数字/纯字符串数组并返回去重同类型数组的函数
解决方案
你遇到的报错是因为TS无法自动推导联合类型数组对应的Set构造函数重载,有两种常用实现方式可以同时满足类型约束和无报错要求:
方案1:函数重载
明确声明两种合法的入参出参对应关系,实现层用兼容类型处理逻辑:
// 重载签名:仅允许纯数字/纯字符串数组输入,对应返回同类型数组 function f(arr: number[]): number[] function f(arr: string[]): string[] // 实现签名 function f(arr: (number | string)[]): (number | string)[] { return [...new Set(arr)] }
调用校验效果完全符合预期:
f([1,2,3])校验通过,返回值类型为number[]f(['1','2','3'])校验通过,返回值类型为string[]f([1,2,'3','4'])触发类型报错,不允许混合类型f([true, {}, 1])触发类型报错,不允许其他类型元素
方案2:泛型约束(更简洁)
通过泛型锁定数组元素的单一类型,约束泛型仅支持number或string即可:
const f = <T extends number | string>(arr: T[]): T[] => { return [...new Set(arr)] }
该方案的调用校验效果和函数重载完全一致,代码更精简。
内容的提问来源于stack exchange,提问作者Mero
相关产品推荐
相关产品推荐

