UNPKG

as-loader

Version:
18 lines (17 loc) 1.44 kB
export declare type NonPointerTypes = number | boolean | bigint; export declare type Pointer<T = unknown> = number & { __brand: "pointer"; __type: T; }; export declare type NullablePointer<T> = T extends undefined | null | void ? null : Pointer<T>; export declare type PointerCast<T, E = NonPointerTypes> = T extends E ? T : T extends new (...args: any) => any ? PointerCastInstance<T, E> : T extends (...args: any) => any ? PointerCastFunction<T, E> : T extends any[] ? Pointer<PointerCastArray<T, E>> : T extends Record<string | symbol | number, any> ? Pointer<PointerCastObject<T, E>> : NullablePointer<T>; export declare type PointerCastArray<T extends any[], E = NonPointerTypes> = { [K in keyof T]: PointerCast<T[K], E>; }; export declare type PointerCastFunction<T extends (...args: any) => any, E = NonPointerTypes> = T extends (...args: infer A) => infer R ? (...args: PointerCastArray<A, E>) => PointerCast<R, E> : never; export declare type PointerCastObject<T extends Record<any, any>, E = NonPointerTypes> = T extends Record<string | symbol | number, any> ? { [K in keyof T]: PointerCast<T[K], E>; } : never; export declare type PointerCastInstance<T extends new (...args: any) => any, E = NonPointerTypes> = T extends new (...args: infer A) => infer R ? (new (...args: PointerCastArray<A, E>) => PointerCastObject<R, E>) & { wrap(ptr: Pointer<PointerCastObject<R, E>>): PointerCastObject<R, E>; } : never;