我正在寻找允许我指定接口的规范/库或标准,例如:
interface Customer {
firstName: string,
lastName: string,
createdAt: Date,
age: number,
}
type CustomerQuery = Query<Customer>如果这样做是有效的:
const customerQuery:CustomerQuery = {
age: {
greaterThan: '29'
}
}该查询将是有效的,因为所有属性都是可选的?,Query将看到传入接口的类型,并允许number使用greaterThen、greaterThenEqual、lessThen、lessThenEqual或值本身等进行查询。
发布于 2019-01-29 17:19:02
用接口替换number类型
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]
}或者,用相同的接口替换number和Date类型
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]
}或者,用不同的接口替换number和Date类型
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类型。
发布于 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 )。
完整的例子:
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;
}>;https://stackoverflow.com/questions/54426062
复制相似问题