import type { ArrayType } from './array.js'; import type * as primitive from './primitives.js'; export interface ArrayOf extends ArrayLike, Iterable, ArrayBufferView { [n: number]: T; } export interface TypeArrayConstructor { new (length: number): ArrayOf; new (buffer?: TArrayBuffer, byteOffset?: number, byteLength?: number): ArrayOf; } /** A definition for a type */ export interface Type { readonly name: string; readonly size: number; readonly array?: TypeArrayConstructor; readonly isDynamic?: boolean; /** Get a value from a buffer */ get(this: void, buffer: ArrayBufferLike, offset: number): T; /** Set a value in a buffer */ set(this: void, buffer: ArrayBufferLike, offset: number, value: T): void; } export declare function isArrayType(type: object): type is ArrayType; export declare function isType(type: unknown): type is Type; export declare function assertType(t: unknown): asserts t is Type; /** * Resolve a type by name. * Useful for serialization (e.g. with JSON) */ export declare function resolveType(typename: string): Type | undefined; /** * Register a type. * Structs and unions are registered automatically. * You should also be able to use this as a decorator. */ export declare function registerType(t: Type): void; export type TypeLike = Type | { constructor: Type; } | primitive.ValidName | undefined | null; export type Value = T extends Type ? V : never; export declare const Void: { readonly name: "void"; readonly size: 0; readonly get: () => void; readonly set: () => void; }; export type Void = typeof Void;