/** * @module * * Types for members. */ import type { Class } from '@hqtsm/class'; import type { Arr, ArrClass } from './arr.js'; import type { Ptr, PtrClass } from './ptr.js'; import type { Type, TypeClass } from './type.js'; /** * If types are equal. * * @template A Type A. * @template B Type B. * @template T True type. * @template F False type. */ type TypesEqual = (() => T extends A ? 1 : 2) extends (() => T extends B ? 1 : 2) ? T : F; /** * Member info. */ export interface MemberInfo { /** * Byte length. */ byteLength: number; /** * Byte offset. */ byteOffset: number; } /** * Member infos. */ export interface MemberInfos { /** * Member infos. */ readonly [member: PropertyKey]: Readonly; } /** * With members class. */ export interface MembersClass extends Class { /** * Member infos of members. */ readonly MEMBERS: MemberInfos; /** * Overlapping members (union), or non-overlapping members (struct, array). */ readonly OVERLAPPING: boolean; } /** * Membered types. */ export type Membered = Arr | Ptr | Type; /** * Membered class types. */ export type MemberedClass = ArrClass> | PtrClass> | TypeClass; /** * The possible member keys. * * @template T Membered type. */ export type MemberKeys = Exclude ? Exclude : never) | (T extends Ptr ? Exclude : never) | (T extends Type ? keyof Type : never)>; /** * The possible member keys for class. * * @template T Membered class type. */ export type MemberClassKeys = MemberKeys>; /** * Memberable types. */ export type Memberable = Arr | Type; /** * Memberable class types. */ export type MemberableClass = ArrClass> | TypeClass; /** * The possible memberable keys, filterable by member type. * * @template T Memberable type. * @template M Member type. */ export type MemberableKeys = { [K in keyof T]: TypesEqual; }[MemberKeys]; /** * The possible memberable keys for class, filterable by member type. * * @template T Memberable class type. * @template M Member type. */ export type MemberableClassKeys = MemberableKeys, M>; export {}; //# sourceMappingURL=members.d.ts.map