![](/img/trans.png)
[英]Typescript - How to dynamically type an object with keys from a dynamic array of objects
[英]How to select the type of an object from an array typescript
我有一個這樣的生成類型:(我無法操縱它)
type Users = Array<
| {
typename: "personal";
firstName: string;
lastName: string;
}
| {
typename: "socialMedia";
userName: string;
email: string;
}
>;
現在我想寫一個新類型,指的是 Users > typename socialMedia
{
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
對其進行索引來訪問其底層變體,然后將該類型與相關的鑒別器 ( playground ) 相交:
type Users = Array<
| {
typename: "personal";
firstName: string;
lastName: string;
}
| {
typename: "socialMedia";
userName: string;
email: string;
}
>;
type userSocialMediaInfo = Users[number] & { typename: "socialMedia";};
簡答
type UserSocialMediaInfo = Extract<Users[0], { typename: "socialMedia" }>
解釋
Users[0]
- 從數組中獲取第一個類型。
Extract<...>
- 從可分配給{ typename: "socialMedia" }
的 union 中提取類型。
更好的選擇
將類型生成邏輯調整為單獨生成類型會更正確。
type PersonelInfo = {
typename: "personal";
firstName: string;
lastName: string;
}
type SocialMediaInfo = {
typename: "socialMedia";
userName: string;
email: string;
}
type Users = Array<PersonelInfo | SocialMediaInfo>;
這可以通過Extract
內置類型實現。 首先,您想將數組“展開”到聯合中。 這可以通過使用number
對其進行索引來實現:
Users[number]
我使用number
以防類型可能在元組中。 獲得聯合后,我們就可以使用Extract
。 這是Extract
的作用:
通過從
Type
中提取可分配給Union
的所有聯合成員來構造一個類型。
那應該意味着如果我們使用:
Extract<Users[number], { typename: "socialMedia" }>
我們將只獲得類型名稱為“socialMedia”的聯合成員,因為這些是唯一可分配給{ typename: "socialMedia" }
的成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.