給定型別:
type Invitation =
| {
__typename?: 'ClientInvitation'
email: string
hash: string
organizationName: string
}
| {
__typename?: 'ExpertInvitation'
email: string
hash: string
expertName: string
}
我如何推斷其中一種型別?
例如:
type ClientInvitation = SomeTypeUtil['ClientInvitation']
應該ClientInvitation有:
{
__typename?: 'ClientInvitation'
email: string
hash: string
organizationName: string
}
uj5u.com熱心網友回復:
最簡單的方法可能是使用帶有重命名鍵的映射型別,如下所示:
type InvitationMap = { [T in Invitation as NonNullable<T['__typename']>]: T }
在這里,我們T在 的聯合成員上迭代型別Invitation。對于每個這樣T的成員,我們希望屬性值為,T并且我們希望屬性鍵是'屬性的字串文字型別。那只是使用indexed access,但這并不完全有效。因為屬性是optional,所以屬性型別將包括(like or )。要快速洗掉,我們可以使用實用程式型別。T__typenameT['__typename']__typenameundefined'ClientInvitation' | undefined'ExpertInvitation' | undefinedundefinedNonNullable<T>
讓我們看一下該InvitationMap型別的 IntelliSense 快速資訊:
/* type InvitationMap = {
ClientInvitation: {
__typename?: "ClientInvitation" | undefined;
email: string;
hash: string;
organizationName: string;
};
ExpertInvitation: {
__typename?: "ExpertInvitation" | undefined;
email: string;
hash: string;
expertName: string;
};
} */
現在我們有了InvitationMap,我們可以使用所需的鍵對其進行索引:
type ClientInvitation = InvitationMap['ClientInvitation'];
/* type ClientInvitation = {
__typename?: "ClientInvitation" | undefined;
email: string;
hash: string;
organizationName: string;
} */
Playground 代碼鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444509.html
標籤:打字稿
上一篇:在Typescript中,我應該有一個單獨的型別來表示從資料庫回傳的記錄和提交的用于創建記錄的資料嗎?
下一篇:手風琴選單,奇怪的語法
