import { Equal } from "./internal/Equal"; import { IsTuple } from "./internal/IsTuple"; import { NativeClass } from "./internal/NativeClass"; import { ValueOf } from "./internal/ValueOf"; /** * Converts a type to its resolved form by erasing all methods. * * `Resolved` transforms classes to plain objects, extracts primitive values * from boxed types (Boolean→boolean, Number→number, String→string), and * recursively processes nested structures. Native classes (Date, Set, Map, * etc.) are preserved unchanged. * * @author Jeongho Nam - https://github.com/samchon * @author Kyungsu Kang - https://github.com/kakasoo * @template T Target type to resolve */ export type Resolved = Equal> extends true ? T : ResolvedMain; type ResolvedMain = T extends [never] ? never // (special trick for jsonable | null) type : ValueOf extends boolean | number | bigint | string ? ValueOf : T extends Function ? never : T extends object ? ResolvedObject : ValueOf; type ResolvedObject = T extends Array ? IsTuple extends true ? ResolvedTuple : ResolvedMain[] : T extends Set ? Set> : T extends Map ? Map, ResolvedMain> : T extends WeakSet | WeakMap ? never : T extends NativeClass ? T : { [P in keyof T]: ResolvedMain; }; type ResolvedTuple = T extends [] ? [] : T extends [infer F] ? [ResolvedMain] : T extends [infer F, ...infer Rest extends readonly any[]] ? [ResolvedMain, ...ResolvedTuple] : T extends [(infer F)?] ? [ResolvedMain?] : T extends [(infer F)?, ...infer Rest extends readonly any[]] ? [ResolvedMain?, ...ResolvedTuple] : [];