在 Typescript 中使用泛型实现消费类型

问题描述 投票:0回答:1

我希望在打字稿中用泛型实现字符串消费者,以排除数组中的重复并防止误用。

例如让我们这里是一个日期格式顺序

["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"]


那么,有什么方法可以限制打字稿中泛型已经使用的值吗?

typescript generics type-inference
1个回答
0
投票

您可以定义两种助手类型

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"];

演示

© www.soinside.com 2019 - 2024. All rights reserved.