一种将字符串联合分配给另一个类型的方法

A way to distribute string union to another Type

我目前有一些 Typescript 代码如下所示:

type UserRole = "admin" | "partner" | "associate";

type User<Role extends UserRole> = {
    // ...
    role: Role;
   //  ...
}

type Users = User<"admin"> | User<"partner"> | User<"associate">

我在 User 类型上使用 Role 类型参数,以在 switch(user.role) 块中对 User 的其他属性进行动态类型化。

这里有没有办法不手动编写 type Users = User<"admin"> | User<"partner"> | User<"associate">,而是在 UserRole 字符串联合上“循环”,以便将其分发给 User 类型?

换句话说,我怎么能写一个类型,以这种方式在我的 User 类型上“分配”字符串联合:

type Distribute<T, S> = // ?????
type Users = Distribute<User, UserRole>; // = User<"admin"> | User<"partner"> | User<"associate">

提前致谢,

注意安全

您可以使用 the distributive property of conditional types。由于我们实际上并不想使用条件类型的条件部分,因此我们将使用始终为真的条件,例如 T extends T

type UserRole = "admin" | "partner" | "associate";

type User<Role extends UserRole> = {
    // ...
    role: Role;
   //  ...
}
type DistributeUsers<T  extends UserRole> = T extends T ? User<T> : never
type Users = DistributeUsers<UserRole>

Playground Link