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