使用可选问号标记属性,而无需重新排序

时间:2019-05-10 13:49:59

标签: typescript

查看以下类型声明:

type exampleType = {
  id: string;
  name: string | undefined;
  age: number;
}

有什么方法可以隐瞒这种类型,如下所示:

type exampleTypeConverted = Convert<exampleType>; // I want this to be equal:
{
  id: string;
  name?: string | undefined;
  age: number;
}

我试图检查可选道具和必需道具(与{ [P in keyof T]: undefined extends T[P] ? P : never }[keyof T];),然后将RequiredProps和OptionalProps相交为一种类型({ [P in RequiredPropNames<T>]: T[P]} & { [P in OptionalPropNames<T>]?: T[P] },但它使属性重新排序。是否有某种方式可以迭代彻底的属性,并为那些无法定义的属性添加问号?

编辑: 好的,让我描述一下到目前为止我所做的事情以及收到的结果:

type OptionalPropNames<T> = { [P in keyof T]: undefined extends T[P] ? P : never }[keyof T];
type RequiredPropNames<T> = { [P in keyof T]: undefined extends T[P] ? never : P }[keyof T];

type Converting<T> = { [P in RequiredPropNames<T>]: T[P]} & { [P in OptionalPropNames<T>]?: T[P] };
type Convert<T> = {[P in keyof Converting<T>]: Converting<T>[P]}

这是我收到的:

type exampleTypeConverted = {
    id: string;
    age: number;
    name?: string | undefined;
}

问题是我希望name属性在新创建的类型中位于第二个位置。

0 个答案:

没有答案