|
| 1 | +export type PrimitiveType = bigint | boolean | null | number | string | symbol | undefined; |
| 2 | + |
| 3 | +export type NonPrimitiveType = object; |
| 4 | + |
| 5 | +export type MergeType<T> = { |
| 6 | + [P in keyof T]: T[P]; |
| 7 | +}; |
| 8 | + |
| 9 | +/** |
| 10 | + * @example |
| 11 | + * interface User { |
| 12 | + * name: string; |
| 13 | + * age: number; |
| 14 | + * address: string; |
| 15 | + * } |
| 16 | + * type UserPartialName = PartialByKeysType<User, "name">; |
| 17 | + * { name?:string; age:number; address:string } |
| 18 | + */ |
| 19 | +export type PartialByKeysType<T, K = keyof T> = MergeType< |
| 20 | + { |
| 21 | + [P in keyof T as P extends K ? P : never]?: T[P]; |
| 22 | + } & { |
| 23 | + [P in keyof T as P extends K ? never : P]: T[P]; |
| 24 | + } |
| 25 | +>; |
| 26 | + |
| 27 | +export type PartialDeepObjectType<T> = T extends object |
| 28 | + ? { |
| 29 | + [P in keyof T]?: PartialDeepObjectType<T[P]>; |
| 30 | + } |
| 31 | + : T; |
| 32 | + |
| 33 | +export type PartialDeepType<T> = T extends Date | bigint | boolean | null | number | string | symbol | undefined |
| 34 | + ? T | undefined |
| 35 | + : T extends Array<infer ArrayType> |
| 36 | + ? Array<PartialDeepType<ArrayType>> |
| 37 | + : T extends ReadonlyArray<infer ArrayType> |
| 38 | + ? ReadonlyArray<ArrayType> |
| 39 | + : T extends Set<infer SetType> |
| 40 | + ? Set<PartialDeepType<SetType>> |
| 41 | + : T extends ReadonlySet<infer SetType> |
| 42 | + ? ReadonlySet<SetType> |
| 43 | + : T extends Map<infer KeyType, infer ValueType> |
| 44 | + ? Map<PartialDeepType<KeyType>, PartialDeepType<ValueType>> |
| 45 | + : T extends ReadonlyMap<infer KeyType, infer ValueType> |
| 46 | + ? ReadonlyMap<PartialDeepType<KeyType>, PartialDeepType<ValueType>> |
| 47 | + : { |
| 48 | + [K in keyof T]?: PartialDeepType<T[K]>; |
| 49 | + }; |
0 commit comments