簡體   English   中英

如何從數組 typescript 中獲取 object 的類型 select

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM