如何从数组类型脚本中选择对象的类型



我有一个生成的类型,如下所示:(我无法操作它(

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>;

最新更新