我希望在打字稿中用泛型实现字符串消费者,以排除数组中的重复并防止误用。
例如让我们这里是一个日期格式顺序
["year", "month", "day"]
我们可以给出这个数组的类型:`Array<"year" | "month" | "day">
但是有一个问题,用户可以像这样写重复的值。
type DateOrder = ["year" | "month" | "day"]
// work
const dateFormatOrder: DateOrder = ["year", "month", "day"]
// it is work too but should be error.
const dateFormatOrder: DateOrder = ["year", "year", "year"]
那么,有什么方法可以限制打字稿中泛型已经使用的值吗?
您可以定义两种助手类型
Unique
和UniqueValues
。
Unique 比较两种类型,如果相同则返回never
,否则返回原始类型。
UniqueValues
使用 Unique
创建一个只有唯一值的新类型。
Exclude
用于删除数组中已经存在的任何值,因此每个值仅与其他值进行比较。
type Unique<T, U> = T extends U ? never : T;
type UniqueValues<T extends readonly any[]> = {
[K in keyof T]: Unique<T[K], Exclude<T[number], T[K]>>
};
type DateOrder = UniqueValues<["year", "month", "day"]>;
const dateFormatOrder: DateOrder = ["year", "month", "day"];
const dateFormatOrderError: DateOrder = ["year", "year", "year"];