import { TASONSerializerOptions } from "./TASONSerializerOptions"; import { type TasonClassMetadata } from "./metadata"; import { TASONNamedTypeInfo, TASONTypeInfo } from "./TASONTypeInfo"; import type { RuntimeSchemaAdapter } from "./schema/RuntimeSchemaAdapter"; export type RegisterTypeOptions = { /** true:该实现成为 getDefaultType;false/缺省:push(追加类型实现),不改当前默认 */ asDefault?: boolean; }; export default class TASONTypeRegistry { private readonly types; /** 默认无 adapter;需显式 setSchemaAdapter(createValibotAdapter()) */ private schemaAdapter; private readonly options; constructor(options: TASONSerializerOptions); /** 克隆一个具有相同注册类型与 adapter 的 TASONTypeRegistry */ clone(): TASONTypeRegistry; /** * 注册或清除 RuntimeSchemaAdapter。 * 传入 null 清除;默认无实现。 */ setSchemaAdapter(adapter: RuntimeSchemaAdapter | null): void; getSchemaAdapter(): RuntimeSchemaAdapter | undefined; /** 与构造 Registry 时的 `allowUnsafeTypes` 相同(核心 `Symbol`、扩展包 unsafe 类型共用)。 */ get allowUnsafeTypes(): boolean; /** * 注册一个类型。 * 同名再注册 = 追加类型实现(push),不改当前默认;`options.asDefault` 则置顶。 * 同一 ctor 已存在时更新该实现(幂等),避免重复 push。 * @param metadata 可选 ClassMetadata(含 schema 契约);R1 存于 entry 旁路 */ registerType(name: string, typeInfo: TASONTypeInfo, metadata?: TasonClassMetadata, options?: RegisterTypeOptions): void; /** * 将 typeInfo 设为该 TypeName 的默认实现。 * 已注册(按 ctor)则置顶;未注册则先注册再置顶。 */ setDefaultType(name: string, typeInfo: TASONTypeInfo): void; /** * 按 ctor 在该 TypeName 下查找并设为默认。找不到则抛错(必须已注册)。 */ setDefaultTypeByCtor(name: string, ctor: abstract new (...args: any[]) => any): void; /** * 按期望构造函数选实现(对齐 C# GetType(name, Type);多实现解析用)。 * 先精确匹配 ctor,再匹配「实现是 expected 的子类」。 * `Object` / `Function` 不作父类回退(否则几乎全中)。 */ getTypeInfoByCtor(name: string, ctor: abstract new (...args: any[]) => any): TASONTypeInfo | undefined; /** * 两个 TypeName 是否指向同一 registry entry(含别名,如 Long ↔ Int64)。 */ isSameTypeName(a: string, b: string): boolean; /** `instanceof ctor`,若 TypeInfo 带 `match` 则再过滤(同一 ctor 多个 TypeName)。 */ private matchesType; private ctorExtends; /** 读取类型的 ClassMetadata(整包);无则 undefined。不提供 getSchema。 */ getClassMetadata(name: string): TasonClassMetadata | undefined; /** * 按 JS 构造函数查找已注册 TypeName(第一个匹配的 entry)。 * Schema 侧只表达 RuntimeType/ctor;转 TypeName 是 Registry 的职责。 */ findTypeNameByCtor(ctor: abstract new (...args: any[]) => any): string | undefined; /** * 按构造函数 + **TypeInstance 标量参数**构造实例(ctor → TypeName → createInstance)。 * 仅用于已带类型语义的标量参数(来自 `Date("…")` 等 TypeInstance 的内部 arg), * **不是**把 JSON 字符串字面量偷换成 Date/RegExp(字面量保真见 mapTypeInstanceToRuntime)。 */ createInstanceByCtor(ctor: abstract new (...args: any[]) => any, scalarArg: string): T; /** 注册一个类型别名,指向已有的类型 */ registerTypeAlias(name: string, originName: string): void; getType(name: string, obj: T): TASONTypeInfo | undefined; getDefaultType(name: string): TASONTypeInfo | undefined; /** 根据名称获取类型信息 */ getAllTypes(name: string): TASONTypeInfo[]; private getEntry; /** 根据初始化参数创建指定类型的实例 */ createInstance(type: string | TASONTypeInfo, arg: string | object): T; /** 将指定类型的实例序列化为其初始化参数 */ serializeToArg(type: string | TASONTypeInfo, value: T): string | object; /** 尝试获取指定对象的类型信息和名称。如果未注册,或者不是object,则返回 undefined */ tryGetTypeInfo(value: object): TASONNamedTypeInfo | undefined; }