将对象属性设为可选,但保持原始属性顺序

时间:2020-09-10 22:26:05

标签: typescript

有人知道一种方法吗(对于这个简单的示例),我如何使“字符串”类型的属性为可选,但同时保持属性的原始顺序

由于在此示例中,必填项+可选属性彼此合并(除了将它们分离并合并在一起,所以不知道其他方式),因此'opt'属性移到末尾...

但我想将其保留在其原始位置,即使(我知道)它也不影响类型安全性,在每个属性都保留在其原始位置

type A = {
    a: boolean,
    opt: string, 
    req: number,
}

export type RequiredProps<T extends object> = Exclude<string & keyof T, OptionalProps<T>>;
export type OptionalProps<T extends object> = {
    [key in keyof T]: T[key] extends string ? key : never;
}[keyof T];

type OptionalStringProps<T extends object> =
    { [key in RequiredProps<T>]: T[key] } &
    { [key in OptionalProps<T>]?: T[key] }
;

type FlattenProps<T> = { [P in keyof T]: T[P] }

type OptionalA = FlattenProps<OptionalStringProps<A>>; 

/*
Result:
  OptionalA = {
    a: boolean,
    req: number;
    opt?: string; <-- got moved to the end!
  }

But what I'd like (original property order):
  OptionalA = {
    a: boolean,
    opt?: string;
    req: number;
  }

*/

PS:FlattenProps仅用于不具有{...}和{...}交集,而用于单个对象类型。

Playground link

0 个答案:

没有答案