[英]Intersection of Discriminated Union Types
我正在嘗試創建一個有區別的聯合類型的交集。 在嘗試了許多不同的方法之后,我發現了keyof
運算符,它似乎有效。 但是,當我將運算符概括為部分函數時,它不起作用。
class Account { ... }
type ILoggedIn =
| { isLoggedIn: boolean; loggedInUser?: any }
| { isLoggedIn: false; loggedInUser?: undefined }
| { isLoggedIn: true; loggedInUser?: any }
type IInitialized =
| { initialized: boolean; account?: undefined }
| { initialized: false; account?: undefined }
| { initialized: true; account?: Account }
type IContextWorks = { [K in keyof ILoggedIn]?: ILoggedIn[K] } &
{ [K in keyof IInitialized]?: IInitialized[K] }
type Partial<T> = { [P in keyof T]?: T[P] }
type IContextNotWork = Partial<ILoggedIn> & Partial<IInitialized>
const valueWorks: IContextWorks = {
account: new Account(),
initialized: true,
isLoggedIn: true,
loggedInUser: {},
}
const valueNotWork: IContextNotWork = {
account: new Account(),
initialized: true,
isLoggedIn: true,
loggedInUser: {},
}
我使用NotWork
版本時遇到的錯誤是:
Type 'boolean' is not assignable to type 'true | undefined'.
我認為要么兩者都有效,要么兩者都行不通,但在這種情況下只有一部分有效。
我做錯了什么?
我認為唯一明智的結果是可以推導出來的。
type UnionOfIntersections =
| { isLoggedIn: boolean; loggedInUser?: any } & { initialized: boolean; account?: undefined }
| { isLoggedIn: boolean; loggedInUser?: any } & { initialized: false; account?: undefined }
| { isLoggedIn: boolean; loggedInUser?: any } & { initialized: true; account?: Account }
| { isLoggedIn: false; loggedInUser?: undefined } & { initialized: boolean; account?: undefined }
| { isLoggedIn: false; loggedInUser?: undefined } & { initialized: false; account?: undefined }
| { isLoggedIn: false; loggedInUser?: undefined } & { initialized: true; account?: Account }
| { isLoggedIn: true; loggedInUser?: any } & { initialized: boolean; account?: undefined }
| { isLoggedIn: true; loggedInUser?: any } & { initialized: false; account?: undefined }
| { isLoggedIn: true; loggedInUser?: any } & { initialized: true; account?: Account }
而且我認為你標記為“不工作”實際上會產生正確的結果。
type IContextNotWork = Partial<ILoggedIn> & Partial<IInitialized>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.