Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 与部分/特殊/全局键名称的接口_Typescript - Fatal编程技术网

Typescript 与部分/特殊/全局键名称的接口

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

关于这篇文章的主题很抱歉。。。如果没有一个例子,我很难描述我的意思

我正在连接一个没有类型脚本类型的外部API,所以我正在创建自己的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运算符{
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