与部分/特殊/全局密钥名称接口

时间:2019-05-14 10:35:13

标签: typescript

很抱歉这篇文章的主题...如果没有示例,我很难描述我的意思。

我正在连接一个没有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中是否可能发生这种情况?

1 个答案:

答案 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