首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型记录接口/ JSON查询类型

类型记录接口/ JSON查询类型
EN

Stack Overflow用户
提问于 2019-01-29 16:58:48
回答 2查看 148关注 0票数 1

我正在寻找允许我指定接口的规范/库或标准,例如:

代码语言:javascript
复制
interface Customer {
  firstName: string,
  lastName: string,
  createdAt: Date,
  age: number,
}

type CustomerQuery = Query<Customer>

如果这样做是有效的:

代码语言:javascript
复制
const customerQuery:CustomerQuery = {
  age: {
    greaterThan: '29'
  }
}

该查询将是有效的,因为所有属性都是可选的?Query将看到传入接口的类型,并允许number使用greaterThengreaterThenEquallessThenlessThenEqual或值本身等进行查询。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-29 17:19:02

用接口替换number类型

代码语言:javascript
复制
interface NumberField {
    greaterThan?: number
    greaterOrEqual?: number
    lessThan?: number
    lessOrEqual?: number
}

type Query<T> = {
    [P in keyof T]?: T[P] extends number ? NumberField | number : T[P]
}

或者,用相同的接口替换numberDate类型

代码语言:javascript
复制
interface ComparableField<T> {
    greaterThan?: T
    greaterOrEqual?: T
    lessThan?: T
    lessOrEqual?: T
}

type Query<T> = {
    [P in keyof T]?:
        T[P] extends number | Date ? ComparableField<T[P]> | T[P]: T[P]
}

或者,用不同的接口替换numberDate类型

代码语言:javascript
复制
interface NumberField {
    greaterThan?: number
    greaterOrEqual?: number
    lessThan?: number
    lessOrEqual?: number
}

interface DateField {
    before?: Date
    after?: Date
}

type Query<T> = {
    [P in keyof T]?:
        T[P] extends number ? NumberField | number :
        T[P] extends Date ? DateField | Date :
        T[P]
}

也读

注意: JSON中不存在Date类型。

票数 2
EN

Stack Overflow用户

发布于 2019-01-29 23:03:49

我想在@Paleo的答案上再加几个特殊的类型,使更多类型和特殊领域之间的映射变得轻而易举。

这样做的目的是将表单type ConstraintsDict = ((s: number) => NumberField) | ((d: Date) => DateField);的一种类型视为字典(就像您用纯代码const dict = { number: 'NumberField', Date: 'DateField'}编写的那样)。

然后,如果您在类型和字段定义之间有一个完整的字典映射,那么在给出一个数字时,您可能希望得到NumberField:type GetFromDict<TDict, Tkey> = TDict extends (arg: Tkey) => infer TValue? TValue: never;会这样做。和以前一样,在纯代码中,它可以被看作是一个dict[key],当键是'number‘时给出'NumberField’,当键在dict中不存在时给出未定义的(在我们的例子中是never )。

完整的例子:

代码语言:javascript
复制
interface NumberField {
  greaterThan?: number;
  greaterOrEqual?: number;
  lessThan?: number;
  lessOrEqual?: number;
}

interface DateField {
  before?: Date;
  after?: Date;
}

// Here you can add whatever mapping between a type and its contraints' fields
type ConstraintsDict = ((s: number) => NumberField) | ((d: Date) => DateField);

type GetFromDict<TDict, Tkey> = TDict extends (arg: Tkey) => infer TValue
  ? TValue
  : never;

type Query<T> = { [P in keyof T]?: GetFromDict<ConstraintsDict, T[P]> | T[P] };

/**
 * The following is equivalent to:
  type QueryStuff = {
    a?: number | NumberField;
    b?: Date | DateField;
    c?: string;
  }
 */
type QueryStuff = Query<{
  a: number;
  b: Date;
  c: string;
}>;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54426062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档