159. 确保函数参数唯一
困难
在 TypeScript 中,有些概念无法通过类型来描述,但可以通过类型约束来表达。例如,你不能为正数定义类型,但你可以检查一个数字字面量类型是否为正数。应用这种约束的模式之一是受限的身份函数(CIF)。
CIF 接受一个参数,推断其类型,执行额外的检查,并返回未修改的参数。
例如:
// 确保 `n` 是一个正数
function positive<const N extends number>(n: `${N}` extends `-${string}` ? never : N) {
return n
}
const a = positive(1) // 正确
const b = positive(-1) // 错误,-1 无法赋值给 never
编写一个 CIF uniqueItems
,它接受一个字面量元组,并确保它们都是唯一的。你可以自由选择使用可变元组或只读元组。
附加任务:提供有用的错误信息,而不是 not assignable to never
。
附加任务:只有重复的元组元素应该被视为错误,而不是整个参数。