diff --git a/types/shared.ts b/types/shared.ts index 4dfc709e4..7ad886aa3 100644 --- a/types/shared.ts +++ b/types/shared.ts @@ -1358,13 +1358,13 @@ export type Camelize = { /** Non object primitives */ export type Primitive = - | string - | number - | symbol - | bigint - | boolean - | undefined - | null; + | string + | number + | symbol + | bigint + | boolean + | undefined + | null; // | object <- don't make object a primitive /** @@ -1374,12 +1374,12 @@ export type Primitive = * export const o: object = []; // no error */ export type ObjectLiteral = { - [K in PropertyKey]: T; + [K in PropertyKey]: T; }; /** Array with no utilty methods, aka Object.create(null) */ export type ArrayWithNoPrototype = { - [index:number]: T | ArrayWithNoPrototype; + [index: number]: T | ArrayWithNoPrototype; }; /** @@ -1388,18 +1388,27 @@ export type ArrayWithNoPrototype = { * @example * export type RequestData = Record>; */ -export type AnythingBut = Exclude; -} | ArrayWithNoPrototype; -}>, T>; +export type AnythingBut = Exclude< + | Primitive + | { + [K in PropertyKey]: AnythingBut; + } + | ArrayWithNoPrototype< + | Primitive + | { + [K in PropertyKey]: AnythingBut; + } + >, + T +>; /** * object identity type */ export type Id = T extends infer U ? { - [K in keyof U]: U[K]; -} : never; + [K in keyof U]: U[K]; +} + : never; export type KeysWithUndefined = { [K in keyof T]-?: undefined extends T[K] ? K @@ -1407,25 +1416,25 @@ export type KeysWithUndefined = { : never; }[keyof T]; -type OptionalizeAux = Id<{ +type OptionalizeAux = Id< + & { [K in KeysWithUndefined]?: Optionalize; -} & { + } + & { [K in Exclude>]: T[K] extends ObjectLiteral ? Optionalize : T[K]; -}>; + } +>; /** * Makes all of properties in T optional when they're null | undefined * it is recursive */ export type Optionalize = T extends object - ? T extends Array - ? number extends T["length"] - ? T[number] extends object - ? Array> - : T - : Partial - : OptionalizeAux - : T; + ? T extends Array ? number extends T["length"] ? T[number] extends object ? Array> + : T + : Partial + : OptionalizeAux + : T; export type PickPartial = & {