查看以下类型声明:
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
属性在新创建的类型中位于第二个位置。