export type Keyof = Extract; export type ValueOf = T[keyof T]; export type Nullable = T | null; export type Undefinable = T | undefined; export type PartialNullable = { [P in keyof T]?: T[P] | null | undefined; }; export type PartialUndefinable = { [P in keyof T]?: T[P] | undefined; }; export type PromiseType = (...args: any[]) => Promise; export type UnPromisify = T extends PromiseType ? U : never; export type KeyValue = { key: K; value: V; }; export type KV = { [k in K]: V; }; export type PartialDeep = T extends object ? T extends Function ? T : { [P in keyof T]?: PartialDeep; } : T; export type RequiredDeep = T extends object ? T extends Function ? T : { [P in keyof T]-?: RequiredDeep; } : T; export type ArrayOneOrMore = { 0: T; } & Array; export type ArrayTwoOrMore = { 0: T; 1: T; } & Array; export type KnownKeys = { [K in keyof T]: string extends K ? never : number extends K ? never : K; } extends { [_ in keyof T]: infer U } ? U : never; export type RequireAtLeastOne = { [K in keyof T]-?: Required> & Partial>>; }[keyof T]; export type UnknownType = Record; export type ReleaseArea = 'china' | 'global'; export type MessageContextMenuStyle = 'bottom-sheet' | 'context' | 'custom'; export type MessageInputBarExtensionStyle = 'bottom-sheet' | 'extension';