如何对某些类型元素使用唯一数组?

How to use unique array for some type elements?

我尝试创建一个导航步骤来存储当前元素。元素可以是 User {id: string, name: string}, Group {id: string, name: string, blocked: boolean}, Expirience {id: string, years: number}.

所以,导航可以是:

public navigation: User[] | Group[] | Expirience[]
add(entity: User[] | Group[] | Expirience[]) {}
remove(entity: User[] | Group[] | Expirience[]) {}

问题是它不可扩展,明天它可能是另一种类型 Car{id: number, name: string}。这个怎么统一?

重要提示:所有类型都应包含 idname 以显示在导航中

这里有可扩展的解决方案:

type Base = {
  id: string;
  name: string;
}

type User = {
  tag: 'User'
} & Base

type Group = {
  tag: 'Group'
} & Base

type Expirience = {
  tag: 'Expirience'
} & Base

type Allowed = User | Group | Expirience

type MakeArray<T extends Base> = T extends Base ? T[] : T

type Result = MakeArray<Allowed>

class Foo<T extends Base> {
  add(entity: MakeArray<T>) {
  }
  remove(entity: MakeArray<T>) { }
}

Playground

您可以将所有允许的 types/interfaces 存储在 Allowed 中。

MakeArray 将元素并集转换为元素数组的并集。换句话说,将 [] 应用于联合中的每个元素。参见 docs

Base 包含所有必需的属性。

如果明天您决定添加Car接口,只需将其添加到Allowed