簡體   English   中英

被歧視的聯盟類型的交叉點

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

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