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

Typescript 使用可选问号标记属性,无需重新排序,typescript,Typescript,查看以下类型声明: type exampleType={ id:字符串; 名称:字符串|未定义; 年龄:人数; } 是否有任何方法将此类型转换为如下所示: type exampleTypeConverted=Convert;//我希望这是平等的: { id:字符串; 名称?:字符串|未定义; 年龄:人数; } 我试图检查可选的和必需的props(使用{[p in keyof T]:未定义的扩展T[p]?p:never}[keyof T];),然后将必需的props和可选的props相交成一种

查看以下类型声明:

type exampleType={
id:字符串;
名称:字符串|未定义;
年龄:人数;
}
是否有任何方法将此类型转换为如下所示:

type exampleTypeConverted=Convert;//我希望这是平等的:
{
id:字符串;
名称?:字符串|未定义;
年龄:人数;
}
我试图检查可选的和必需的props(使用
{[p in keyof T]:未定义的扩展T[p]?p:never}[keyof T];
),然后将必需的props和可选的props相交成一种类型(
{[p in required propnames]:T[p]}&{[p in OptionalPropNames]?:T[p]}
,但它会使属性重新排序。是否有任何方法可以以某种方式迭代完整的属性,并为那些可以未定义的属性添加问号

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

type OptionalPropNames={[P in keyof T]:未定义的扩展T[P]?P:never}[keyof T];
类型RequiredPropNames={[P in keyof T]:未定义的扩展T[P]?从不:P}[keyof T];
类型转换={[P在RequiredPropNames中]:T[P]}&{[P在OptionalPropNames中]?:T[P]};
类型Convert={[P in keyof Converting]:Converting[P]}
以下是我收到的:

类型示例TypeConverted={
id:字符串;
年龄:人数;
名称?:字符串|未定义;
}

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

我很困惑,您是否有一个“exampleType”数组要转换为“exampleTypeConverted”数组不重新排序?不,这是类型转换。我将编辑问题,使其更清楚一点。键顺序不影响结构类型(例如,
{a:string,b:number}
{b:number,a:string}
的类型完全相同)所以你想要这样的东西的唯一原因是为了美学。我也怀疑这些东西是否应该被暴露出来(这类似于暴露工会成员的顺序,也就是说),因此,任何解决方案都可能是临时的,可能会在该语言的未来版本中出现中断。不过,我喜欢这个想法。我理解您正在尝试做什么(尽管最好包含atempt的完整代码示例)。问题是,如果排序不是来自原始类型本身,它将必须来自我们创建的其他联合,但联合排序不能保证我们不能以任何方式依赖它。而且这不是一个公正的“版本间可能中断的事情”,而是一个“运行之间的差异”的事情。好吧,我希望现在已经清楚了。我很困惑,你知道吗你有一个“exampleType”数组,你想在不重新排序的情况下将其转换为“exampleTypeConverted”数组吗?不,这是类型转换。我将编辑问题使其更清楚一点。键顺序不影响结构类型(例如,
{a:string,b:number}
{b:number,a:string}
的类型完全相同)所以你想要这样的东西的唯一原因是为了美学。我也怀疑这些东西是否应该被暴露出来(这类似于暴露工会成员的顺序,也就是说),因此,任何解决方案都可能是临时的,可能会在该语言的未来版本中出现中断。不过,我喜欢这个想法。我理解您正在尝试做什么(尽管最好包含atempt的完整代码示例)。问题是,如果排序不是来自原始类型本身,那么它必须来自我们创建的其他联合,但联合排序不能保证我们不能以任何方式依赖它。而且这不是一个公正的“版本间可能中断的事情”,而是一个“运行之间的差异”好的,我希望现在已经清楚了。