/**
 * Structural member extraction from type declarations,
 * index-signature dictionary conversion, and type-alias body expansion.
 *
 * Split from references-structural.ts for file-size compliance (< 500 LOC).
 */
import * as ts from "typescript";
import { IrType, IrDictionaryType, IrInterfaceMember } from "../../../types.js";
import type { Binding } from "../../../binding/index.js";
/**
 * Extract structural members from type declarations (AST-based).
 *
 * DETERMINISTIC IR TYPING (INV-0 compliant):
 * Uses AST nodes directly instead of ts.Type computation.
 * Gets TypeNodes from declarations, not from getTypeOfSymbolAtLocation.
 *
 * Used to populate structuralMembers on referenceType for interfaces, object type aliases,
 * and public instance class surfaces.
 * This enables TSN5110 validation for object literal properties against expected types,
 * and preserves deterministic member typing for nominal classes used structurally across
 * callback/contextual-typing boundaries.
 *
 * Safety guards:
 * - Only extracts for interfaces/type-aliases/public instance classes (not enums/lib types)
 * - Uses cache to prevent infinite recursion on recursive types
 * - Skips unsupported keys instead of bailing entirely
 * - Returns undefined for index signatures (can't fully represent)
 *
 * @param declId - The DeclId for the type (from Binding.resolveTypeReference)
 * @param binding - The Binding layer for symbol resolution
 * @param convertType - Function to convert nested types
 * @returns Structural members or undefined if extraction fails/skipped
 */
export declare const extractStructuralMembersFromDeclarations: (declId: number | undefined, binding: Binding, convertType: (node: ts.TypeNode, binding: Binding) => IrType) => readonly IrInterfaceMember[] | undefined;
/**
 * Try to convert a pure index-signature interface/type alias to dictionaryType.
 *
 * This supports idiomatic TS dictionary surfaces:
 *   interface MetricsTotals { [metric: string]: int }
 *   type MetricsTotals = { [metric: string]: int }
 *
 * Without this, computed access `totals["pageviews"]` is misclassified as
 * a CLR indexer and fails numeric proof (TSN5107). This is not a workaround:
 * index-signature-only shapes are structural dictionaries and should compile
 * to `Dictionary<K, V>` / `Record<K, V>` behavior.
 */
export declare const tryConvertPureIndexSignatureToDictionary: (decl: ts.Declaration, convertType: (node: ts.TypeNode, binding: Binding) => IrType, binding: Binding) => IrDictionaryType | undefined;
/**
 * Expand a type alias body with optional type-parameter substitution.
 *
 * Shared helper used by both declaration-file alias erasure and user-defined
 * type alias erasure paths in convertTypeReference.
 */
export declare const expandTypeAliasBody: (declId: number, declNode: ts.TypeAliasDeclaration, node: ts.TypeReferenceNode, binding: Binding, convertType: (node: ts.TypeNode, binding: Binding) => IrType) => IrType | undefined;
//# sourceMappingURL=references-structural-members.d.ts.map