Typescript 与部分/特殊/全局键名称的接口
关于这篇文章的主题很抱歉。。。如果没有一个例子,我很难描述我的意思 我正在连接一个没有类型脚本类型的外部API,所以我正在创建自己的API。他们API上的一个特性是搜索资源的过滤系统,这使用一个特殊的键值来确定您想要什么。。。我想为它创建一个接口 它的格式是Typescript 与部分/特殊/全局键名称的接口,typescript,Typescript,关于这篇文章的主题很抱歉。。。如果没有一个例子,我很难描述我的意思 我正在连接一个没有类型脚本类型的外部API,所以我正在创建自己的API。他们API上的一个特性是搜索资源的过滤系统,这使用一个特殊的键值来确定您想要什么。。。我想为它创建一个接口 它的格式是name[operator]:value,下面是一些示例: first_name[is]: "Bob" last_name[is_not]: "Smith" email[starts_with]: "roger@" price[gt]: 12
name[operator]:value
,下面是一些示例:
first_name[is]: "Bob"
last_name[is_not]: "Smith"
email[starts_with]: "roger@"
price[gt]: 123
// etc etc.
所以我想要的,在伪TypeScript代码中是这样的:
enum运算符{
Is=“Is”,
IsNot=“is_not”,
StartsWith=“以开始”,
}
接口滤波器{
姓氏[运算符]:字符串,
电子邮件[操作员]:字符串,
}
在TypeScript 3.x中是否可以这样做?您可以使用映射类型执行此操作:
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运算符{
Is=“Is”,
IsNot=“is_not”,
StartsWith=“以开始”,
}
接口滤波器{
姓氏:部分
电子邮件:部分
}
设f:IFilter={
电邮:{},
姓氏:{}
}
f、 电子邮件[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
enum运算符{
Is=“Is”,
Gt=“Gt”,
IsNot=“is_not”,
StartsWith=“以开始”,
}
类型筛选器={
[P in keyof T]:部分
}
接口IPerson{
电子邮件:string,
姓氏:string,
年龄:数目
}
设f:Filter={
电邮:{},
姓氏:{},
年龄:{}
}
f、 电子邮件[Operator.Is]=“”
f、 年龄[Operator.Gt]=1//ok
f、 年龄[Operator.Gt]=“1”//err
您可以使用映射类型执行此操作:
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运算符{
Is=“Is”,
IsNot=“is_not”,
StartsWith=“以开始”,
}
接口滤波器{
姓氏:部分
电子邮件:部分
}
设f:IFilter={
电邮:{},
姓氏:{}
}
f、 电子邮件[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
enum运算符{
Is=“Is”,
Gt=“Gt”,
IsNot=“is_not”,
StartsWith=“以开始”,
}
类型筛选器={
[P in keyof T]:部分
}
接口IPerson{
电子邮件:string,
姓氏:string,
年龄:数目
}
设f:Filter={
电邮:{},
姓氏:{},
年龄:{}
}
f、 电子邮件[Operator.Is]=“”
f、 年龄[Operator.Gt]=1//ok
f、 年龄[Operator.Gt]=“1”//err