我有一个生成的类型,如下所示:(我无法操作它(
type Users = Array<
| {
typename: "personal";
firstName: string;
lastName: string;
}
| {
typename: "socialMedia";
userName: string;
email: string;
}
>;
现在我想写一个新的类型,它引用Users>typename社交媒体
{
typename: "socialMedia";
userName: string;
email: string;
}
我希望新的类型是上面的代码
type userSocialMediaInfo = ?????
这可能吗?
最好从两个不同的类型构造Users
类型,这样您就可以访问这些类型而无需派生,例如:
type Personal = {
typename: "personal";
firstName: string;
lastName: string;
};
type SocialMedia = {
typename: "socialMedia";
userName: string;
email: string;
};
type Users = Array<Personal| SocialMedia>;
否则,如果您无法控制Users
类型,您可以通过用number
对其进行索引,然后将该类型与相关鉴别器(游乐场(相交来访问其潜在变体:
type Users = Array<
| {
typename: "personal";
firstName: string;
lastName: string;
}
| {
typename: "socialMedia";
userName: string;
email: string;
}
>;
type userSocialMediaInfo = Users[number] & { typename: "socialMedia";};
这在Extract
内置类型中是可能的。首先,你想"打开";将数组转换为并集。这可以通过使用number
:进行索引来实现
Users[number]
我使用number
,以防类型可能是元组。在我们得到并集之后,我们可以使用Extract
。以下是Extract
的作用:
通过从
Type
中提取可分配给Union
的所有并集成员来构造类型。
这应该意味着如果我们使用:
Extract<Users[number], { typename: "socialMedia" }>
我们将只得到类型名称为"的工会成员;socialMedia";,因为这些是唯一可分配给CCD_ 11的成员。
游乐场
简短回答
type UserSocialMediaInfo = Extract<Users[0], { typename: "socialMedia" }>
解释
Users[0]
-从数组中获取第一个类型。
Extract<...>
-从可分配给{ typename: "socialMedia" }
的并集中提取类型。
更好的替代方案
将类型生成逻辑调整为单独生成类型会更正确。
type PersonelInfo = {
typename: "personal";
firstName: string;
lastName: string;
}
type SocialMediaInfo = {
typename: "socialMedia";
userName: string;
email: string;
}
type Users = Array<PersonelInfo | SocialMediaInfo>;