很抱歉这篇文章的主题...如果没有示例,我很难描述我的意思。
我正在连接一个没有TypeScript类型的外部API,所以我要自己做。他们在API上拥有的一个功能是一个用于搜索资源的筛选器系统,它使用一个特殊的键值来确定您想要的...我想为其创建一个接口。
它以name[operator]: value
的格式出现,因此它的一些示例:
first_name[is]: "Bob"
last_name[is_not]: "Smith"
email[starts_with]: "roger@"
price[gt]: 123
// etc etc.
所以我想要的,在伪TypeScript代码中是这样的:
enum Operator {
Is = "is",
IsNot = "is_not",
StartsWith = "starts_with",
}
interface IFilter {
last_name[Operator]: string,
email[Operator]: string,
}
在TypeScript 3.x中是否可能发生这种情况?
答案 0 :(得分:0)
您可以使用映射类型来做到这一点:
enum Operator {
Is = "is",
IsNot = "is_not",
StartsWith = "starts_with",
}
interface IFilter {
last_name: Partial<Record<Operator, string>>
email: Partial<Record<Operator, string>>
}
let f: IFilter = {
email: {},
last_name: {}
}
f.email[Operator.Is] = ""
您甚至可以构建映射类型以采用现有类型并将其映射为过滤器类型:
enum Operator {
Is = "is",
Gt = "gt",
IsNot = "is_not",
StartsWith = "starts_with",
}
type Filter<T> = {
[P in keyof T]: Partial<Record<Operator, T[P]>>
}
interface IPerson {
email: string,
last_name: string,
age: number
}
let f: Filter<IPerson> = {
email: {},
last_name: {},
age: {}
}
f.email[Operator.Is] = ""
f.age[Operator.Gt] = 1 //ok
f.age[Operator.Gt] = "1" //err