如何对某些类型元素使用唯一数组?
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}
。这个怎么统一?
重要提示:所有类型都应包含 id
和 name
以显示在导航中
这里有可扩展的解决方案:
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>) { }
}
您可以将所有允许的 types/interfaces 存储在 Allowed
中。
MakeArray
将元素并集转换为元素数组的并集。换句话说,将 []
应用于联合中的每个元素。参见 docs
Base
包含所有必需的属性。
如果明天您决定添加Car
接口,只需将其添加到Allowed
我尝试创建一个导航步骤来存储当前元素。元素可以是 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}
。这个怎么统一?
重要提示:所有类型都应包含 id
和 name
以显示在导航中
这里有可扩展的解决方案:
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>) { }
}
您可以将所有允许的 types/interfaces 存储在 Allowed
中。
MakeArray
将元素并集转换为元素数组的并集。换句话说,将 []
应用于联合中的每个元素。参见 docs
Base
包含所有必需的属性。
如果明天您决定添加Car
接口,只需将其添加到Allowed