@tslite/checker 0.14.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,948 @@
1
+ /** Uma propriedade de um tipo objeto. */
2
+ interface Prop {
3
+ readonly type: Schema;
4
+ /** `true` quando a propriedade pode estar ausente (`{ x?: T }`). */
5
+ readonly optional?: boolean;
6
+ }
7
+ /**
8
+ * Assinatura de índice de um objeto — `{ [k: string]: V }` (a forma de `Record<K, V>`).
9
+ * Coexiste com props nomeadas (`{ a: number; [k: string]: unknown }`), como no TS.
10
+ * O domínio da chave é só `string`/`number` (o que o TS permite).
11
+ */
12
+ interface IndexSig {
13
+ readonly key: "string" | "number";
14
+ readonly value: Schema;
15
+ }
16
+ /**
17
+ * Flag de um elemento de tupla, na forma da 3.9 (DECISIONS D49 da raiz):
18
+ * - `req` — elemento posicional normal (`A` em `[A, B]`);
19
+ * - `optional` — `A?` (pode estar ausente; `[A, B?]`); só TRAILING, posicional;
20
+ * - `rest` — `...T[]` (cauda de array); o tipo do elemento é o do array. Só no FIM.
21
+ */
22
+ type ElementFlag = "req" | "optional" | "rest";
23
+ /** Um parâmetro de um tipo função. */
24
+ interface Param {
25
+ readonly name: string;
26
+ readonly type: Schema;
27
+ /** `true` quando o argumento pode ser omitido. */
28
+ readonly optional?: boolean;
29
+ /** `true` para o parâmetro rest (`...args: T[]`). */
30
+ readonly variadic?: boolean;
31
+ }
32
+ /**
33
+ * Type predicate `(v) => v is S` — quando a fn devolve `true`, o argumento na
34
+ * posição `param` é estreitado para `type` (S). `returns` da fn continua `boolean`
35
+ * (é o que roda); o `guard` é a info de narrowing. `filter`/`find` inferem S dele;
36
+ * `if (g(x))` estreita `x` (D13). Covariante em `type`.
37
+ */
38
+ interface GuardSig {
39
+ readonly param: number;
40
+ readonly type: Schema;
41
+ }
42
+ /**
43
+ * Um type parameter — a ENTIDADE do tsc (`TypeParameter`), numa forma só para
44
+ * todo lugar que declara (`fn`/assinatura de `overload`, `TypeScheme`, `infer`).
45
+ *
46
+ * Tem dois papéis, como no tsc, onde a ocorrência de `T` no corpo **é** o objeto
47
+ * declarado:
48
+ * - **declaração** (nas listas `typeParams`/`params`/`infer`): a autoridade — nome,
49
+ * `bound` e `default`;
50
+ * - **ocorrência** (no corpo): nome e `bound`, que é o que a álgebra lê sem conhecer
51
+ * o binder (`apparentType` de `T extends C` é `C`, TC26). O `default` só existe na
52
+ * declaração: só a aridade o usa.
53
+ *
54
+ * A identidade é o NOME no escopo do binder, não a referência (o `Schema` é JSON
55
+ * imutável, TC17) — daí o `substitute` evitar captura (TC37).
56
+ *
57
+ * É um alias de tipo, e não uma `interface`, como todo membro da união `Schema`: só o
58
+ * alias ganha a assinatura de índice implícita, e é ela que deixa o `Schema` caber em
59
+ * `Record<string, unknown>` — o que um consumidor que recebe um tipo como objeto
60
+ * genérico espera (TC41).
61
+ */
62
+ type VarSchema = {
63
+ readonly t: "var";
64
+ readonly name: string;
65
+ /** `extends bound` — a constraint (TC10). */
66
+ readonly bound?: Schema;
67
+ /** `= default` — só na DECLARAÇÃO (TC37). */
68
+ readonly default?: Schema;
69
+ };
70
+ /**
71
+ * O tipo de um valor na linguagem TSLite.
72
+ *
73
+ * O discriminador é `t`. Estruturas (object/array/union/fn) referenciam outros
74
+ * `Schema` recursivamente — inclusive de forma cíclica (ex.: `Node` que contém
75
+ * `Node[]`); as operações que percorrem `Schema` são cycle-safe.
76
+ */
77
+ type Schema = {
78
+ readonly t: "any";
79
+ } | {
80
+ readonly t: "unknown";
81
+ } | {
82
+ readonly t: "string";
83
+ } | {
84
+ readonly t: "number";
85
+ } | {
86
+ readonly t: "boolean";
87
+ } | {
88
+ readonly t: "null";
89
+ } | {
90
+ readonly t: "undefined";
91
+ } | {
92
+ readonly t: "void";
93
+ }
94
+ /**
95
+ * A keyword `object` — o NÃO-PRIMITIVO (o `nonPrimitiveType` do tsc,
96
+ * `checker.ts:735`). Aceita objeto, array, tupla e função; recusa todo primitivo,
97
+ * `null` e `undefined`. A forma inspecionável dele é `{}` (TC54), então ler uma
98
+ * propriedade falha.
99
+ *
100
+ * O kind não se chama `object` porque esse nome é do objeto ESTRUTURAL (TC22); é o
101
+ * `format` que o imprime `object`, como lá.
102
+ */
103
+ | {
104
+ readonly t: "nonPrimitive";
105
+ } | {
106
+ readonly t: "literal";
107
+ readonly value: string | number | boolean;
108
+ /**
109
+ * `fresh` = literal "fresco" de uma EXPRESSÃO de valor (`1`, `"x"`) — alarga
110
+ * pra base em posição de membro (array/object/tupla) ou inferido num `T[]`,
111
+ * mas preserva no topo (`const x = 1` → `1`; `id(1)` → `1`). Literal de
112
+ * `keyof`/declarado é NÃO-fresh → nunca alarga. Transparente p/ subtype/equals.
113
+ */
114
+ readonly fresh?: boolean;
115
+ } | {
116
+ readonly t: "object";
117
+ readonly props: Readonly<Record<string, Prop>>;
118
+ /** Assinatura de índice (`Record<K, V>`); coexiste com `props`. Ausente = objeto fechado. */
119
+ readonly index?: IndexSig;
120
+ /** A ORIGEM: este tipo nasceu de um literal escrito no código — ver {@link fromLiteral}. */
121
+ readonly fromLiteral?: boolean;
122
+ /**
123
+ * O literal que o originou tinha um **spread** (`{ ...o, a: 1 }`) — o
124
+ * `ObjectFlags.ContainsSpread` do tsc. Só o widening o lê: um membro assim não
125
+ * CONTRIBUI as suas chaves para os irmãos de uma união (mas recebe as deles).
126
+ * Ver {@link widenObjectLiteral} e TC53.
127
+ */
128
+ readonly hasSpread?: boolean;
129
+ } | {
130
+ readonly t: "array";
131
+ readonly items: Schema;
132
+ /**
133
+ * `readonly T[]` (o `ReadonlyArray<T>` do TS). Só afeta a RELAÇÃO, e num
134
+ * sentido: `T[] ≤ readonly T[]`, mas **não** o contrário — dar um readonly
135
+ * onde se espera mutável perderia a garantia. TC28.
136
+ */
137
+ readonly readonly?: boolean;
138
+ /** A ORIGEM: este tipo nasceu de um literal escrito no código — ver {@link fromLiteral}. */
139
+ readonly fromLiteral?: boolean;
140
+ } | {
141
+ readonly t: "tuple";
142
+ readonly elements: readonly Schema[];
143
+ readonly flags?: readonly ElementFlag[];
144
+ /** `readonly [A, B]` — mesma regra do array readonly (TC28). */
145
+ readonly readonly?: boolean;
146
+ /** A ORIGEM: este tipo nasceu de um literal escrito no código — ver {@link fromLiteral}. */
147
+ readonly fromLiteral?: boolean;
148
+ } | {
149
+ readonly t: "union";
150
+ readonly of: readonly Schema[];
151
+ } | {
152
+ readonly t: "fn";
153
+ readonly params: readonly Param[];
154
+ readonly returns: Schema;
155
+ /** Type predicate `(v) => v is S` — narrowing (ver `GuardSig`). */
156
+ readonly guard?: GuardSig;
157
+ /**
158
+ * As DECLARAÇÕES dos type params, em ordem (`<T, K extends keyof T = D>`).
159
+ * Ausente = a assinatura **não é genérica** — que é o que o tsc diz quando
160
+ * `Signature.typeParameters` é `undefined`.
161
+ *
162
+ * A ordem é a declarada, nunca a da aparição das `var`: sem ela não dá para
163
+ * ligar o `f<T>(x)` nem checar aridade, e o tsc trata a chamada como
164
+ * não-genérica (TS2558). Cada entrada é a declaração inteira (TC37).
165
+ */
166
+ readonly typeParams?: readonly VarSchema[];
167
+ } | {
168
+ readonly t: "overload";
169
+ readonly signatures: readonly {
170
+ readonly t: "fn";
171
+ readonly params: readonly Param[];
172
+ readonly returns: Schema;
173
+ readonly guard?: GuardSig;
174
+ /** As declarações dos type params desta assinatura (ver o `fn` acima). */
175
+ readonly typeParams?: readonly VarSchema[];
176
+ }[];
177
+ } | {
178
+ readonly t: "keyof";
179
+ readonly of: Schema;
180
+ } | {
181
+ readonly t: "index";
182
+ readonly obj: Schema;
183
+ readonly key: Schema;
184
+ } | {
185
+ readonly t: "mapped";
186
+ readonly key: string;
187
+ readonly over: Schema;
188
+ readonly body: Schema;
189
+ readonly optional?: boolean;
190
+ } | {
191
+ readonly t: "conditional";
192
+ readonly check: Schema;
193
+ readonly extends: Schema;
194
+ readonly then: Schema;
195
+ readonly else: Schema;
196
+ readonly infer?: readonly VarSchema[];
197
+ } | {
198
+ readonly t: "intersection";
199
+ readonly of: readonly Schema[];
200
+ } | {
201
+ readonly t: "returnType";
202
+ readonly fn: Schema;
203
+ } | {
204
+ readonly t: "parameters";
205
+ readonly fn: Schema;
206
+ } | VarSchema | {
207
+ /**
208
+ * `typeof x` em posição de TIPO — o *type query* do TS.
209
+ *
210
+ * É o único nó do vocabulário que **não** se resolve pela álgebra: ele
211
+ * pergunta o tipo de um **VALOR**, e valor é assunto do escopo, que este
212
+ * package não conhece (zero-dep, por desenho). Quem resolve é o checker,
213
+ * no ponto de USO — espelhando o `getTypeFromTypeQueryNode` do tsc, que é
214
+ * lazy (`links.resolvedType`) pelo mesmo motivo.
215
+ *
216
+ * Um `typeQuery` que chegue à álgebra é sinal de que a resolução não
217
+ * aconteceu (nome inexistente — já reportado); os algoritmos o tratam como
218
+ * folha opaca, sem estourar.
219
+ */
220
+ readonly t: "typeQuery";
221
+ /** O entity name, em partes: `typeof obj.m` → `["obj", "m"]`. */
222
+ readonly path: readonly string[];
223
+ } | {
224
+ readonly t: "apply";
225
+ readonly name: string;
226
+ readonly args: readonly Schema[];
227
+ };
228
+ type AnySchema = Extract<Schema, {
229
+ t: "any";
230
+ }>;
231
+ type UnknownSchema = Extract<Schema, {
232
+ t: "unknown";
233
+ }>;
234
+ type LiteralSchema = Extract<Schema, {
235
+ t: "literal";
236
+ }>;
237
+ type ObjectSchema = Extract<Schema, {
238
+ t: "object";
239
+ }>;
240
+ type ArraySchema = Extract<Schema, {
241
+ t: "array";
242
+ }>;
243
+ type TupleSchema = Extract<Schema, {
244
+ t: "tuple";
245
+ }>;
246
+ type UnionSchema = Extract<Schema, {
247
+ t: "union";
248
+ }>;
249
+ type FnSchema$1 = Extract<Schema, {
250
+ t: "fn";
251
+ }>;
252
+ type OverloadSchema = Extract<Schema, {
253
+ t: "overload";
254
+ }>;
255
+ type KeyofSchema = Extract<Schema, {
256
+ t: "keyof";
257
+ }>;
258
+ type IndexSchema = Extract<Schema, {
259
+ t: "index";
260
+ }>;
261
+ type MappedSchema = Extract<Schema, {
262
+ t: "mapped";
263
+ }>;
264
+ type ConditionalSchema = Extract<Schema, {
265
+ t: "conditional";
266
+ }>;
267
+ type ApplySchema = Extract<Schema, {
268
+ t: "apply";
269
+ }>;
270
+ type ScalarSchema = Extract<Schema, {
271
+ t: "string" | "number" | "boolean" | "null" | "undefined";
272
+ }>;
273
+ /**
274
+ * Um *type scheme*: um tipo nomeado parametrizado, `type Pair<A, B> = body`.
275
+ * `params` são as DECLARAÇÕES dos type params (na ordem); `body` é o `Schema` que
276
+ * as usa via `var`. Um tipo nomeado não-genérico é só um scheme com `params: []`.
277
+ *
278
+ * Cada declaração carrega o `extends` (`bound`) e o `=` (`default`), como a do
279
+ * `fn` — a mesma entidade (TC37): um param com default pode ser omitido na
280
+ * aplicação (`Box` ≡ `Box<number>` para `type Box<T = number>`), o default pode
281
+ * citar os params anteriores (`<T, U = T[]>`), e um arg tem de caber no bound
282
+ * (TS2344). Quem os cobra é a aplicação (`expand`, o checker).
283
+ */
284
+ interface TypeScheme {
285
+ readonly params: readonly VarSchema[];
286
+ readonly body: Schema;
287
+ }
288
+ /** Registro de type schemes por nome — consultado pela expansão (ver `expand`). */
289
+ type Schemes = Readonly<Record<string, TypeScheme>>;
290
+ declare const s: {
291
+ readonly any: Schema;
292
+ readonly unknown: Schema;
293
+ readonly string: Schema;
294
+ readonly number: Schema;
295
+ readonly boolean: Schema;
296
+ readonly null: Schema;
297
+ readonly undefined: Schema;
298
+ readonly void: Schema;
299
+ /** A keyword `object`: o não-primitivo (TC54). */
300
+ readonly nonPrimitive: Schema;
301
+ readonly literal: (value: string | number | boolean) => Schema;
302
+ readonly object: (props: Record<string, Prop>, index?: IndexSig) => Schema;
303
+ /** `Record<K, V>` — objeto só com assinatura de índice `{ [k: K]: V }`. */
304
+ readonly record: (value: Schema, key?: "string" | "number") => Schema;
305
+ readonly array: (items: Schema, ro?: boolean) => Schema;
306
+ /**
307
+ * Tupla `[A, B]`, `[A, B?]` ou `[A, ...B[]]` — comprimento e posições conhecidos.
308
+ *
309
+ * O elemento **opcional** nasce com `undefined` no tipo, e é por isso que ninguém
310
+ * precisa lembrar de pedi-lo depois: é o `getTypeFromOptionalTypeNode` do tsc
311
+ * (`checker.ts:12229`), `strictNullChecks ? getOptionalType(type) : type` ao ler o
312
+ * nó `number?` — e é o que faz ele imprimir `[string, (number | undefined)?]`.
313
+ *
314
+ * A flag `optional` continua marcando a ARIDADE (o `minLength`), que é a outra
315
+ * pergunta: `[A, B?]` tem comprimento `1 | 2`, e é isso que o separa de
316
+ * `[A, B | undefined]`, que o tsc recusa um contra o outro. O `rest` NÃO ganha
317
+ * `undefined` — lá ele não passa por esse nó.
318
+ */
319
+ readonly tuple: (elements: readonly Schema[], flags?: readonly ElementFlag[], ro?: boolean) => Schema;
320
+ /**
321
+ * `typeParams` são as DECLARAÇÕES dos type params, em ordem (`s.typeParam`) —
322
+ * omitir significa "não é genérica" (e um `f<T>(x)` sobre ela vira erro de
323
+ * aridade, como no tsc). As `var` do corpo carregam a mesma constraint (TC37).
324
+ */
325
+ readonly fn: (params: Param[], returns: Schema, typeParams?: readonly VarSchema[]) => Schema;
326
+ /** Type predicate `(…) => v is S` — fn que devolve `boolean` e estreita o param `i`. */
327
+ readonly guard: (params: Param[], type: Schema, param?: number) => Schema;
328
+ /**
329
+ * Overload: o mesmo valor com várias assinaturas de chamada (a 1ª que casa
330
+ * vence). Ex. Ramda `add`: `[(a,b)=>number, (a)=>(b)=>number]`.
331
+ */
332
+ readonly overload: (signatures: FnSchema$1[]) => Schema;
333
+ /** `keyof T` — a união (de literais) das chaves de `T`. Resolve quando `T` é concreto. */
334
+ readonly keyof: (of: Schema) => Schema;
335
+ /** `T[K]` — acesso indexado. Resolve quando `T` é objeto/array e `K` é literal/união. */
336
+ readonly index: (obj: Schema, key: Schema) => Schema;
337
+ /** `{ [key in over]?: body }` — mapped type. Resolve quando `over` dá chaves literais. */
338
+ readonly mapped: (key: string, over: Schema, body: Schema, optional?: boolean) => Schema;
339
+ /** `check extends ext ? then : els` — conditional. `infer` = as declarações dos
340
+ * `infer U` introduzidos no `ext` (as posições são `var(U)`); resolve via `unify`
341
+ * (ver `resolveConditional`). Sem `infer` → conditional simples (discriminante concreto). */
342
+ readonly conditional: (check: Schema, ext: Schema, then: Schema, els: Schema, infer?: readonly VarSchema[]) => Schema;
343
+ /** `A & B` — interseção. Funde objetos concretos; lazy com `var`. */
344
+ /**
345
+ * `A & B`, pelas leis do reticulado — o construtor NORMALIZA (TC20), como o
346
+ * `s.union` absorve o topo (TC44): `& never` é `never`, o escalar disjunto zera
347
+ * (`number & string`, `1 & 2`, `"a" & undefined` → `never`) e a subsunção mantém o
348
+ * mais estreito (`string & "x"` → `"x"`). Medido na 3.9.10, é o que o
349
+ * `getIntersectionType` faz — e são os mesmos vereditos.
350
+ *
351
+ * Sem isto a interseção disjunta atravessava intacta e contaminava quem a
352
+ * contivesse: `null[] | ("a" & undefined)` deixava de ser reflexivo, onde no tsc a
353
+ * união é só `null[]`.
354
+ */
355
+ readonly intersection: (of: readonly Schema[]) => Schema;
356
+ /** Açúcar para `A & B` (dois membros). */
357
+ readonly and: (a: Schema, b: Schema) => Schema;
358
+ /** `ReturnType<F>` — o retorno de uma `fn`. Resolve quando `F` é concreto. */
359
+ readonly returnType: (fn: Schema) => Schema;
360
+ readonly parameters: (fn: Schema) => Schema;
361
+ /** A OCORRÊNCIA de um type param (`T` no corpo), com a constraint da declaração. */
362
+ readonly var: (name: string, bound?: Schema) => VarSchema;
363
+ /**
364
+ * A DECLARAÇÃO de um type param (`<K extends C = D>`) — a entrada das listas
365
+ * `fn.typeParams`, `TypeScheme.params` e `conditional.infer` (TC37). As
366
+ * ocorrências no corpo são `s.var(name, bound)`.
367
+ */
368
+ readonly typeParam: (name: string, decl?: {
369
+ bound?: Schema;
370
+ default?: Schema;
371
+ }) => VarSchema;
372
+ /**
373
+ * `typeof x` em posição de tipo. Resolvido pelo **checker** (precisa do escopo
374
+ * de valor), não pela álgebra — ver o JSDoc do nó `typeQuery`.
375
+ */
376
+ readonly typeQuery: (path: readonly string[]) => Schema;
377
+ /** Construtor de tipo aplicado: `apply("Map", [K, V])` ⇒ `Map<K, V>`. */
378
+ readonly apply: (name: string, args?: readonly Schema[]) => Schema;
379
+ /** Açúcar para `Promise<T>` — o que `await` desembrulha. */
380
+ readonly promise: (value: Schema) => Schema;
381
+ /**
382
+ * A união, pela forma CANÔNICA barata — o `getUnionType` do tsc no modo padrão
383
+ * (`UnionReduction.Literal`, `checker.ts:12362`), passo a passo:
384
+ *
385
+ * - achata as aninhadas, e o `never` some (o `addTypesToUnion`);
386
+ * - **absorve o topo**: com `any` é `any`, com `unknown` é `unknown` (TC44);
387
+ * - **deduplica** o que lá tem a mesma identidade: a mesma referência, e as FOLHAS
388
+ * por valor (primitivos e literais são internados lá). Dois objetos iguais de
389
+ * origens diferentes NÃO se unem aqui — lá também não: têm identidades distintas,
390
+ * e uni-los é a redução por SUBTIPO, que é o {@link normalizeUnion}, sob pedido;
391
+ * - tira o literal que a base já cobre (`"a" | string` é `string` — o
392
+ * `removeRedundantLiteralTypes`), e `true | false` é `boolean` (lá `boolean` É
393
+ * essa união, internada; aqui é kind próprio — TC23);
394
+ * - zero membros é `never`, e UM membro é ele mesmo.
395
+ *
396
+ * É a porta única: um tipo que o tsc não saberia construir não deve existir (TC50).
397
+ */
398
+ readonly union: (of: readonly Schema[]) => Schema;
399
+ };
400
+ /** Resolve um `keyof`/`index` um nível quando possível; senão, devolve `t` como está. */
401
+ declare function resolveTypeOp(t: Schema): Schema;
402
+ /**
403
+ * O acesso indexado cuja chave **não existe** no objeto — o que o tsc reporta como
404
+ * TS2339 e resolve para o `errorType` (`getIndexedAccessType`:
405
+ * `getIndexedAccessTypeOrUndefined(…) || (accessNode ? errorType : unknownType)`).
406
+ *
407
+ * É um `unknown` de identidade única, como o {@link silentNever} é um `never` (TC39):
408
+ * quem tem o NÓ da anotação o reconhece por referência, reporta e o troca pelo
409
+ * tipo-erro; quem não tem lê um `unknown` — o que o tsc faz sem `accessNode`. A
410
+ * identidade não sobrevive a `JSON.stringify` nem à reconstrução do nó, e não
411
+ * precisa: ela vive entre a resolução e quem a consulta.
412
+ */
413
+ declare const missingType: Schema;
414
+ /** O acesso indexado resolveu para "a chave não existe"? (identidade, não forma.) */
415
+ declare const isMissingType: (t: Schema) => boolean;
416
+ /**
417
+ * A ORIGEM de um tipo de objeto, array ou tupla: ele nasceu de um **literal escrito no
418
+ * código** (`{ a: 1 }`, `["a"]`) e não de uma anotação ou de um alias. É o
419
+ * `ObjectFlags.ObjectLiteral | ArrayLiteral` do tsc — *"originates in an object/array
420
+ * literal"* (`types.ts:4498` e `4507` na tag).
421
+ *
422
+ * **Não é frescura.** No tsc as duas marcas convivem e são lidas por quem responde a
423
+ * perguntas diferentes: a `FreshLiteral` some quando o tipo é regularizado
424
+ * (`getRegularTypeOfObjectLiteral` faz `objectFlags & ~FreshLiteral`) e é o que a
425
+ * checagem de propriedade excedente lê; a de ORIGEM **nunca** é removida, sobrevive ao
426
+ * widening, e é o que a INFERÊNCIA lê (`isObjectOrArrayLiteralType`, `checker.ts:19138`).
427
+ *
428
+ * Aqui só a origem mora no tipo. A frescura continua vindo do NÓ — o `ObjectExpression`
429
+ * numa borda contextual —, que é a decisão do checker D47 e responde bem onde ela é
430
+ * usada. A origem não pode vir do nó: a inferência roda na álgebra, longe dele.
431
+ *
432
+ * Para que serve: o `getCovariantInference` junta os candidatos de origem literal num só
433
+ * antes de escolher o supertipo comum, e é isso que faz `f({ a: 1 }, 1)` inferir `1`
434
+ * (com o literal acusado) enquanto `f(o, 1)` com `o` declarado infere `{ a: number }`
435
+ * (com o `1` acusado). Sem a marca, o erro sai no argumento errado (TC47).
436
+ */
437
+ declare const isObjectOrArrayLiteral: (t: Schema) => boolean;
438
+ /** O mesmo tipo marcado como vindo de um literal escrito (ver {@link isObjectOrArrayLiteral}). */
439
+ declare const asLiteralOrigin: (t: Schema) => Schema;
440
+ declare const ownProp: (props: Readonly<Record<string, Prop>>, key: string) => Prop | undefined;
441
+ /**
442
+ * Separa `undefined` de um tipo: devolve o tipo **sem** `undefined` e se ele estava
443
+ * presente. Em posição de **propriedade**, `T | undefined` é uma propriedade
444
+ * **opcional** de tipo `T` — espelha o `JSON.stringify` (chave `undefined` some).
445
+ * Só mexe em `undefined`, nunca em `null` (que é valor JSON presente). Usado pelo
446
+ * `serializable` e pelo `toJsonSchema` (mesma regra dos dois lados).
447
+ */
448
+ declare function withoutUndefined(t: Schema): {
449
+ type: Schema;
450
+ hadUndefined: boolean;
451
+ };
452
+ /**
453
+ * Nome de propriedade NUMÉRICO canônico — o `isNumericLiteralName` do tsc: o texto é
454
+ * exatamente `ToString(ToNumber(texto))`. `"1"`, `"-1"`, `"0.5"`, `"1e+21"`, `"NaN"`,
455
+ * `"Infinity"` são; `"01"`, `"1.0"`, `"-0"`, `"1e3"`, `"x"` não. É o que uma index
456
+ * signature `number` alcança: só essas chaves; as demais ficam livres.
457
+ */
458
+ declare const isNumericLiteralName: (name: string) => boolean;
459
+
460
+ /** A flag do elemento `i` de uma tupla (ausente = `req`). */
461
+ declare const flagAt: (t: TupleSchema, i: number) => ElementFlag;
462
+ /** A tupla termina num elemento `rest`? (senão tem comprimento limitado; `optional`
463
+ * NÃO conta). */
464
+ declare const isVariadicTuple: (t: TupleSchema) => boolean;
465
+ /** O índice do elemento `rest` (sempre o último), ou -1. */
466
+ declare const restIndex: (t: TupleSchema) => number;
467
+
468
+ type IncompatibilityKind = "missing" | "type";
469
+ /** Um ponto de incompatibilidade entre `actual` e `expected`. */
470
+ interface Incompatibility {
471
+ /** Caminho até o ponto: `[]` = raiz, `["count"]`, `["user","name"]`. */
472
+ readonly path: readonly string[];
473
+ /** O tipo esperado naquele ponto. */
474
+ readonly expected: Schema;
475
+ /** O tipo que veio — ausente quando `kind === "missing"` (a prop não existe). */
476
+ readonly actual?: Schema;
477
+ readonly kind: IncompatibilityKind;
478
+ }
479
+ /** Renderiza um `typeDiff` numa frase legível (o feedback que brilha). Missing
480
+ * são AGREGADOS (como o tsc: "missing the following properties: a, b, c"). */
481
+ declare function formatTypeDiff(incs: readonly Incompatibility[]): string;
482
+
483
+ /**
484
+ * `typeDiff(a, b)` — POR QUE `a ⊄ b`: lista de incompatibilidades com caminho +
485
+ * razão (≅ a elaboração do tsc). É o `subtype` em **modo elaboração** (uma fonte de
486
+ * verdade, sem walk paralelo — a lição do `propertiesRelatedTo`). Caminho FRIO: roda
487
+ * só ao reportar; NÃO usa o relation cache. `[]` = compatível.
488
+ */
489
+ declare function typeDiff(a: Schema, b: Schema, schemes?: Schemes): Incompatibility[];
490
+ /** `true` se um valor de tipo `a` pode ser usado onde se espera `b`. */
491
+ declare function subtype(a: Schema, b: Schema, schemes?: Schemes): boolean;
492
+ /**
493
+ * `true` se `a` é COMPARÁVEL a `b` — o `isTypeComparableTo` do tsc, a relação que
494
+ * decide se uma asserção de tipo se sobrepõe. É direcional como o `subtype` (a
495
+ * estrutura do alvo continua sendo exigida da origem), mas folgada onde o tsc a
496
+ * folga: folhas nas duas direções, união na origem por algum membro, `unknown`
497
+ * sobreposto a tudo, prop opcional lida como `T | undefined`. A regra completa do
498
+ * `as` (alargar a origem e testar os dois sentidos) é de quem tipa a asserção.
499
+ */
500
+ declare function comparable(a: Schema, b: Schema, schemes?: Schemes): boolean;
501
+ /** Igualdade estrutural: cada um é atribuível ao outro. */
502
+ declare function equals(a: Schema, b: Schema, schemes?: Schemes): boolean;
503
+ /**
504
+ * Resolve um conditional `check extends ext ? then : else` escolhendo o ramo —
505
+ * **só quando o discriminante é ground** (sem `var` livre em `check`/`extends`),
506
+ * via `subtype(check, ext)`. Com var no discriminante → `null` (fica lazy até o
507
+ * `substitute` ligar as vars). Os ramos `then`/`else` podem ter vars (resolvem
508
+ * depois). É o análogo do `resolveTypeOp`/`resolveMapped` para conditionals.
509
+ */
510
+ declare function resolveConditional(c: ConditionalSchema, schemes: Schemes): Schema | null;
511
+ type FnSchema = Extract<Schema, {
512
+ t: "fn";
513
+ }>;
514
+ /**
515
+ * O tipo do argumento na posição `i` — o `tryGetTypeAtPosition` do tsc: o parâmetro
516
+ * fixo; depois dele, o elemento do rest (array) ou a posição do rest (tupla).
517
+ * `undefined` sem parâmetro ali, ou com rest genérico (`...args: T`), que só se
518
+ * resolve instanciado.
519
+ */
520
+ declare function typeAtPosition(sig: FnSchema, i: number): Schema | undefined;
521
+ /**
522
+ * Normaliza uma união: achata, absorve `any`/`unknown`, deduplica e remove
523
+ * membros subsumidos por outro (`string | "x"` → `string`). Colapsa união de um
524
+ * membro no próprio membro. União vazia permanece vazia (renderiza `never`).
525
+ *
526
+ * É a redução por SUBTIPO do tsc — o `getUnionType` com `UnionReduction.Subtype`,
527
+ * pedido explicitamente por quem a quer (o `getCommonSupertype`, o widening de uma
528
+ * união com `{}`, os candidatos de inferência). O construtor `s.union` faz só a
529
+ * barata; esta custa uma relação por par (TC50).
530
+ */
531
+ declare function normalizeUnion(members: readonly Schema[]): Schema;
532
+
533
+ /**
534
+ * Profundidade máxima de **comparações aninhadas** na relação — o `depth` do
535
+ * `recursiveTypeRelatedTo` do tsc, que corta em 100 (`checker.ts:16217` na tag) e
536
+ * reporta "Excessive stack depth comparing types" (TS2321).
537
+ *
538
+ * É o número do tsc, não um acima dele: todo teto nosso é ≤ ao dele (DECISIONS D50 da
539
+ * raiz), porque o checker roda no navegador do cliente e não num build. Medido, a folga
540
+ * é grande — a suíte inteira alcança 5 comparações aninhadas no `@tslite/types` e 14 no
541
+ * `@tslite/checker`, e a pilha do V8 aguenta ~1561. O profile pode apertar
542
+ * ({@link configureTypeLimits}); afrouxar acima de 100 é defeito.
543
+ */
544
+ declare const TYPE_EVAL_DEPTH_LIMIT = 100;
545
+ /**
546
+ * Profundidade máxima de **instanciação** — o `instantiationDepth` do tsc, que corta em
547
+ * 50 (`instantiateType`, `checker.ts:14293`) e reporta TS2589. É outro eixo que o da
548
+ * relação: ali se COMPARA, aqui se CONSTRÓI um tipo novo a cada passo, e é o que um
549
+ * genérico que se instancia sem fim faz crescer.
550
+ */
551
+ declare const INSTANTIATION_DEPTH_LIMIT = 50;
552
+ /**
553
+ * Teto de **contagem** de instanciações, por expressão — o `instantiationCount` do tsc
554
+ * (5.000.000 na mesma linha), zerado a cada `checkExpression`/`checkSourceElement`
555
+ * (`checker.ts:29192`, `34607`). Ele pega o que a profundidade não pega: uma explosão
556
+ * LARGA, em que cada instanciação é rasa mas há milhões delas.
557
+ */
558
+ declare const INSTANTIATION_COUNT_LIMIT = 5000000;
559
+ /** Os tetos de avaliação de tipo (Proposal 003), todos ≤ aos do tsc (D50 da raiz):
560
+ * `maxTypeDepth` ↔ TS2321 (relação); `maxInstantiationDepth`/`maxInstantiationCount` ↔
561
+ * TS2589 (instanciação); `maxUnionMembers` ↔ TS2590; `maxOverloadSignatures` é nosso (o
562
+ * tsc não tem teto ali). */
563
+ interface TypeEvalLimits {
564
+ readonly maxTypeDepth: number;
565
+ readonly maxInstantiationDepth: number;
566
+ readonly maxInstantiationCount: number;
567
+ readonly maxUnionMembers: number;
568
+ readonly maxOverloadSignatures: number;
569
+ }
570
+ /** Default standalone (quando o `@tslite/types` roda sem profile — infer/json-schema).
571
+ * Cada número é o do tsc ou menor (D50): nenhum deles é escolha nossa "folgada". */
572
+ declare const DEFAULT_TYPE_LIMITS: TypeEvalLimits;
573
+ /** Configura os tetos globais (o checker chama no início de `check()` a partir do
574
+ * profile). Mescla sobre o default. Resetar com {@link resetTypeLimits} no finally. */
575
+ declare function configureTypeLimits(limits: Partial<TypeEvalLimits>): void;
576
+ /** Volta aos defaults (chamado no `finally` do consumidor). */
577
+ declare function resetTypeLimits(): void;
578
+ /** Os tetos ativos no momento (lido pela álgebra: `subtype`/`normalizeUnion`). */
579
+ declare function typeLimits(): TypeEvalLimits;
580
+ /** Lançado quando a avaliação de tipo excede a profundidade (`maxTypeDepth`) — o
581
+ * "Excessive stack depth comparing types" do tsc (TS2321). */
582
+ declare class TypeEvalLimitError extends Error {
583
+ constructor(depth?: number);
584
+ }
585
+ /**
586
+ * Lançado quando a INSTANCIAÇÃO excede a profundidade ou a contagem — o
587
+ * "Type instantiation is excessively deep and possibly infinite" do tsc (TS2589), que
588
+ * usa a mesma mensagem para os dois tetos.
589
+ *
590
+ * É erro próprio, e não o {@link TypeEvalLimitError}, porque o eixo é outro: lá se
591
+ * compara dois tipos, aqui se constrói um novo a cada passo. O consumidor mapeia os dois
592
+ * para `too-deep` (o catálogo do checker tem um código por conceito), e a MENSAGEM diz
593
+ * qual é o caso.
594
+ */
595
+ declare class InstantiationLimitError extends Error {
596
+ readonly kind: "depth" | "count";
597
+ constructor(kind: "depth" | "count", limit?: number);
598
+ }
599
+ /**
600
+ * Contagem de instanciações da expressão atual — o `instantiationCount` do tsc, que é
601
+ * zerado a cada expressão checada (`checker.ts:29192`), e não somado pelo programa
602
+ * inteiro. O consumidor chama isto onde o tsc zera; sem chamar, o teto vale para a
603
+ * checagem toda, que é mais apertado (nunca mais frouxo).
604
+ */
605
+ declare function resetInstantiationCount(): void;
606
+ /** Lançado quando uma união excede `maxUnionMembers` (fiel ao TS2590 do tsc:
607
+ * "Expression produces a union type that is too complex to represent"). */
608
+ declare class UnionTooComplexError extends Error {
609
+ constructor(count: number, limit?: number);
610
+ }
611
+
612
+ /** As features de tipo gateadas presentes em `schema` (recursivo, cycle-safe).
613
+ * `recursionName` (o nome do alias sendo autorado) liga a detecção de `recursion`. */
614
+ declare function typeFeatures(schema: Schema, recursionName?: string): Set<string>;
615
+
616
+ /** Ligações `nome da var → tipo` (o resultado de `unify`/aplicação de scheme). */
617
+ type Bindings = Readonly<Record<string, Schema>>;
618
+ /** Uma assinatura: um `fn` ou uma entrada de `overload.signatures`. */
619
+ type Signature = FnSchema$1 | OverloadSchema["signatures"][number];
620
+ /**
621
+ * Aplica `bindings` a `schema`, trocando cada `var` ligada pelo seu tipo.
622
+ *
623
+ * Cada nó substituído conta para o teto de CONTAGEM (o `instantiationCount` do tsc, 5M
624
+ * por expressão) — é a medida do trabalho de instanciação, e pega a explosão LARGA que
625
+ * a profundidade não vê. A **profundidade** não é cobrada aqui, e o motivo está no
626
+ * {@link expand1}: descer a árvore de um tipo grande não é "instanciação aninhada".
627
+ */
628
+ declare function substitute(schema: Schema, bindings: Bindings, seen?: WeakSet<object>): Schema;
629
+ /**
630
+ * A assinatura com os type params que ela declara renomeados para fora de `avoid`
631
+ * (`U` → `U_1`, a convenção do tsc), nas declarações e nas ocorrências. É a
632
+ * separação que o tsc tem de graça por identidade de objeto: ao relacionar duas
633
+ * assinaturas, o `U` que uma declara não pode ser confundido com um `U` livre da outra.
634
+ */
635
+ declare function renameTypeParams<S extends Signature>(sig: S, avoid: ReadonlySet<string>): S;
636
+ /** Os nomes de `var` LIVRES em `schema` — os que um binder declara não entram (TC37). */
637
+ declare function freeVars(schema: Schema): ReadonlySet<string>;
638
+
639
+ /**
640
+ * O curinga "sem inferência" — o `silentNeverType` do tsc: um `never` que ocupa, no
641
+ * contextual que uma chamada passa a uma chamada genérica aninhada, o lugar de um type
642
+ * param dela que ainda não tem candidato (o `getInferredType` com `NoDefault`). Nada se
643
+ * infere dele. É comparado por IDENTIDADE, como lá, e não é dado persistível: vive só
644
+ * durante a inferência de uma chamada.
645
+ */
646
+ declare const silentNever: Schema;
647
+ /**
648
+ * Os candidatos de inferência de uma var, na ORDEM em que a inferência os encontrou —
649
+ * o `InferenceInfo.candidates`/`contraCandidates` do tsc. Duas listas, porque a
650
+ * POSIÇÃO em que o candidato foi achado decide como ele vale: o que veio de um
651
+ * PARÂMETRO de função é contravariante (TC48).
652
+ */
653
+ interface VarCandidates {
654
+ readonly co: Schema[];
655
+ readonly contra: Schema[];
656
+ }
657
+ /**
658
+ * O tipo inferido de uma var a partir dos seus candidatos — o `getCovariantInference`
659
+ * do tsc (`checker.ts:19156`), em TRÊS etapas: os de origem literal se juntam num só
660
+ * (posto no fim), o resto decide o supertipo comum, e o que sai passa pelo
661
+ * {@link widenOrigin} — o `getWidenedType` que fecha a função lá (`checker.ts:19174`),
662
+ * e que é o que completa uma união de literais com as chaves dos irmãos (TC53).
663
+ */
664
+ declare function covariantInference(candidates: readonly Schema[], schemes?: Schemes): Schema | undefined;
665
+ /**
666
+ * O tipo inferido de uma var a partir dos candidatos CONTRAVARIANTES — o
667
+ * `getContravariantInference` do tsc (`checker.ts:19152`), que sem a prioridade de
668
+ * combinação é o `getCommonSubtype` (`checker.ts:17700`): o menor deles, pelo
669
+ * `reduceLeft` com a relação invertida.
670
+ */
671
+ declare function contravariantInference(candidates: readonly Schema[], schemes?: Schemes): Schema | undefined;
672
+ /**
673
+ * A decisão de UMA var, com as duas listas — o `getInferredType` do tsc
674
+ * (`checker.ts:19177`).
675
+ *
676
+ * Havendo candidatos contravariantes, eles têm a preferência, **salvo** quando o
677
+ * covariante existe, não é `never` e é subtipo deles. É essa exceção que faz
678
+ * `k((x) => {}, 1)` com `<T,>(f: (x: T) => void, v: T): T` inferir `1` e não `number`:
679
+ * o `number` do parâmetro do callback é contravariante, o `1` do argumento é
680
+ * covariante, e `1 ≤ number` — então vence o `1`.
681
+ */
682
+ declare function inferFromCandidates(slot: VarCandidates, schemes?: Schemes): Schema | undefined;
683
+
684
+ /** `getErasedSignature` do tsc: os type params da assinatura viram `any`. É o que a
685
+ * inferência faz com uma assinatura-ALVO genérica — os type params dela não são
686
+ * candidatos da chamada de fora, e não podem vazar para as ligações dela. */
687
+ declare function erasedSignature(sig: FnSchema$1): FnSchema$1;
688
+ /**
689
+ * O tipo inferido de cada type param declarado — o `getInferredType` do tsc: o
690
+ * candidato; sem ele, o default (instanciado com o que já foi inferido), senão
691
+ * `unknown`; e o que não cabe na constraint, candidato ou default, vira a constraint.
692
+ * As ligações que não são dos declarados atravessam como estão.
693
+ */
694
+ declare function inferredTypes(decls: readonly VarSchema[], b: Bindings, schemes?: Schemes): Bindings;
695
+ /**
696
+ * O `instantiateSignatureInContextOf` do tsc, para relacionar uma assinatura-FONTE
697
+ * genérica com uma assinatura-ALVO: os type params da fonte são inferidos dos
698
+ * parâmetros do alvo (posição a posição) e, para o que eles não ligaram, do retorno —
699
+ * a prioridade menor do tsc (`InferencePriority.ReturnType`). O resto passa pelo
700
+ * `inferredTypes`. Os type params do ALVO ficam como estão: rígidos, o canônico do tsc.
701
+ * Devolve a fonte instanciada, não-genérica.
702
+ */
703
+ declare function instantiateInContextOf(sig: FnSchema$1, context: FnSchema$1, schemes?: Schemes): FnSchema$1;
704
+ /**
705
+ * Liga as `var`s de `pattern` aos tipos correspondentes em `actual`. Devolve as
706
+ * ligações estendidas, ou `null` se forem incompatíveis. `actual` que seja
707
+ * `any`/`unknown` não constrange vars (deixa-as livres).
708
+ */
709
+ declare function unify(pattern: Schema, actual: Schema, bindings?: Bindings): Bindings | null;
710
+ /** Resultado de instanciar uma assinatura contra argumentos. */
711
+ interface Instantiation {
712
+ readonly returns: Schema;
713
+ readonly bindings: Bindings;
714
+ }
715
+ /**
716
+ * Instancia uma função genérica: unifica cada argumento contra o parâmetro
717
+ * correspondente (ligando as `var`s) e devolve o retorno já substituído.
718
+ * Falha (`null`) se algum argumento não unificar. Um parâmetro `variadic`
719
+ * absorve os argumentos restantes (cada um unifica contra o tipo do rest).
720
+ */
721
+ declare function instantiate(sig: FnSchema$1, args: readonly Schema[], schemes?: Schemes): Instantiation | null;
722
+ /**
723
+ * Versão tolerante de {@link instantiate} para o editor/checker: nunca falha —
724
+ * argumentos que não unificam são ignorados, e `var`s não ligadas permanecem
725
+ * (útil para aplicação parcial e enquanto o usuário ainda digita).
726
+ */
727
+ declare function instantiateLoose(sig: FnSchema$1, args: readonly Schema[], schemes?: Schemes): Instantiation;
728
+ /**
729
+ * Aterra as `var`s remanescentes em `unknown` (para exibição do resultado). Resolve
730
+ * de passagem um `conditional` cujo discriminante já é ground → o tipo do resultado
731
+ * sai concreto (ex.: `ReturnType<F>` aplicado vira o retorno real). `schemes` é
732
+ * preciso pra resolver conditionals que checam contra type aliases.
733
+ */
734
+ declare function groundVars(schema: Schema, schemes?: Schemes, seen?: WeakSet<object>, depth0?: number,
735
+ /** Nomes que NÃO são aterrados: as vars RÍGIDAS de quem chama (o `T` da função
736
+ * genérica que envolve a chamada), que no tsc continuam `T` no resultado. */
737
+ keep?: ReadonlySet<string>): Schema;
738
+
739
+ /**
740
+ * O supremo estrutural de `a` e `b`: o menor `Schema` ao qual ambos são
741
+ * atribuíveis. `unknown` é a unidade (sem-evidência); `any` é absorvente.
742
+ */
743
+ declare function join(a: Schema, b: Schema): Schema;
744
+ /**
745
+ * Dobra uma lista de formas no seu supremo comum. Lista vazia → `never` (⊥, a
746
+ * identidade do supremo). Um membro → ele mesmo. É a operação do schema-reducer:
747
+ * `joinAll(amostras.map(inferValue))` descreve todas as amostras.
748
+ */
749
+ declare function joinAll(members: readonly Schema[]): Schema;
750
+
751
+ /**
752
+ * A aridade de uma lista de type params — de um alias (`TypeScheme.params`) ou de
753
+ * uma assinatura (`fn.typeParams`), que são a mesma entidade (TC37): `min` são os
754
+ * params até o último sem default, `max` são todos. Uma aplicação com `n`
755
+ * argumentos cabe quando `min ≤ n ≤ max`; os que faltam vêm do default. É o
756
+ * `getMinTypeArgumentCount` do tsc, que também serve aos dois.
757
+ */
758
+ declare function typeParamArity(params: readonly VarSchema[]): {
759
+ min: number;
760
+ max: number;
761
+ };
762
+ /**
763
+ * As ligações de uma aplicação: `param_i → arg_i`, e os params que faltam recebem
764
+ * o default — substituído com o que já foi ligado, para `<T, U = T[]>` dar
765
+ * `U = number[]` em `Pair<number>`. É o `fillMissingTypeArguments` do tsc.
766
+ */
767
+ declare function bindTypeParams(params: readonly VarSchema[], args: readonly Schema[]): Record<string, Schema>;
768
+ /** Há um scheme registrado para este `apply` (com aridade compatível)? */
769
+ declare function isScheme(t: Schema, schemes: Schemes): boolean;
770
+ /**
771
+ * Expande **um nível**: `apply(name, args)` com scheme registrado vira
772
+ * `substitute(body, { param_i → args_i })` — os params omitidos vêm do default.
773
+ * Qualquer outro tipo (ou `apply` opaco) é devolvido intacto.
774
+ *
775
+ * **Não há contador de profundidade aqui, e isso é estrutural.** No tsc a instanciação
776
+ * aninha — o `instantiateType` de um objeto cria um tipo com membros LAZY, e ler um
777
+ * membro dispara outra instanciação DENTRO da primeira, que é o que o
778
+ * `instantiationDepth` (50) conta. Aqui a expansão é um passo PURO sobre uma árvore
779
+ * imutável: expande um nível, devolve, e quem chamou segue — nunca uma expansão dentro
780
+ * de outra. Quem limita esta dimensão é o desdobramento em LOOP de quem consome
781
+ * (`apparentType`, `resolveApplied`, `evalKeys`), e o teto deles é o
782
+ * `maxInstantiationDepth` — o mesmo 50 do tsc (DECISIONS D50 da raiz).
783
+ */
784
+ declare function expand1(t: Schema, schemes: Schemes): Schema;
785
+
786
+ /**
787
+ * Normaliza `t` até a forma que dá para INSPECIONAR (ler props, extrair chaves):
788
+ *
789
+ * - `var T extends C` → `C` (a constraint; o `getBaseConstraintOfType` do tsc);
790
+ * - `apply("X")` COM scheme registrado → expande **um nível** e continua (lazy,
791
+ * para tipo recursivo terminar). Sem scheme, fica opaco — é a ilha nominal
792
+ * legítima (`Promise`, `Map`), TC2;
793
+ * - `mapped` concreto → o objeto resultante;
794
+ * - `intersection` → a forma canônica (membros aparentes);
795
+ * - o resto → ele mesmo.
796
+ *
797
+ * Idempotente e cycle-safe por profundidade. NÃO resolve operadores de tipo —
798
+ * isso é do `resolveTypeOp`; aqui só se prepara o OPERANDO (ver `resolveOp`).
799
+ */
800
+ declare function apparentType(t: Schema, schemes?: Schemes, depth?: number): Schema;
801
+ /**
802
+ * Resolve um operador de tipo (`keyof`/`T[K]`/`ReturnType`) **ciente de schemes**:
803
+ * normaliza o OPERANDO com {@link apparentType} e então resolve. É o que faz
804
+ * `keyof Property` virar `"id" | "title"` como no tsc.
805
+ *
806
+ * Devolve o próprio `t` quando não há o que resolver (operando genérico) — a
807
+ * mesma semântica do `resolveTypeOp`, então é substituível onde os `schemes`
808
+ * estiverem disponíveis.
809
+ */
810
+ declare function resolveOp(t: Schema, schemes?: Schemes): Schema;
811
+
812
+ /**
813
+ * Um valor JSON do tipo — o que um campo recém-criado contém.
814
+ *
815
+ * | tipo | valor |
816
+ * | --- | --- |
817
+ * | `string` · `number` · `boolean` · `null` | `""` · `0` · `false` · `null` |
818
+ * | literal | o próprio literal |
819
+ * | array | `[]` |
820
+ * | tupla | cada posição obrigatória com o seu exemplo; opcional e rest ausentes |
821
+ * | objeto | as propriedades **obrigatórias** preenchidas; as opcionais ausentes |
822
+ * | record / só índice | `{}` |
823
+ * | interseção de objetos | a mescla (a forma aparente) |
824
+ * | união que contém `null` | `null` — o inicial de algo anulável é a ausência |
825
+ * | outra união | o exemplo do primeiro membro que não seja `undefined` |
826
+ * | tipo nomeado / scheme | o exemplo do tipo expandido |
827
+ * | `unknown` · `any` · função · `undefined` · `void` · o que não tem valor JSON | `null` |
828
+ *
829
+ * Um valor preenchido por esta regra é atribuível ao próprio schema, para todo
830
+ * tipo que descreve dado — é o que evita um segundo `missing-properties` no
831
+ * lugar do primeiro.
832
+ */
833
+ declare function sampleValue(schema: Schema, schemes?: Schemes): unknown;
834
+
835
+ /** Alarga um literal FRESH pra sua base; mantém não-fresh e não-literais. Raso —
836
+ * usado por elemento na CONSTRUÇÃO de array/object/tupla literal (no checker). */
837
+ declare function widen(t: Schema): Schema;
838
+ /**
839
+ * O `getWidenedLiteralType` do tsc (`checker.ts:25661`): alarga literal **fresh**
840
+ * e **distribui sobre união** — `1 | 2` (frescos) vira `number`. Mantém não-fresh.
841
+ *
842
+ * É a regra do binding MUTÁVEL: `let n = 1` é `number`, `const c = 1` é `1`
843
+ * (`getWidenedLiteralTypeForInitializer`, `checker.ts:41456` — const/readonly
844
+ * mantém, o resto alarga). Sem isto, `let n = 1; n = 2` erraria, porque o binding
845
+ * teria ficado com o tipo `1`.
846
+ *
847
+ * Difere do `widen` (raso, sem união) e do `widenType` (fundo, entra em
848
+ * membro): aqui é só o TOPO, distribuindo em união — exatamente o do tsc.
849
+ */
850
+ declare function widenLiteral(t: Schema): Schema;
851
+ /**
852
+ * O `getBaseTypeOfLiteralType` do tsc: TODO literal vira a sua base — fresco ou não —
853
+ * e distribui sobre união (`"a" | "b"` → `string`).
854
+ *
855
+ * É o que a asserção de tipo faz com a ORIGEM antes de medir sobreposição: em
856
+ * `(x: 1) => x as 2` a origem vale `number`, que se sobrepõe a `2`. Difere do
857
+ * `widenLiteral`, que só alarga o literal fresco — um parâmetro anotado `1` não é
858
+ * fresco, e mesmo assim a asserção o lê pela base.
859
+ */
860
+ declare function baseLiteralType(t: Schema): Schema;
861
+ /**
862
+ * Widening TOTAL (`getWidenedType` do TS): alarga todo literal fresh, **inclusive
863
+ * o do topo**. É a regra do **retorno de função** (`() => 1` → `() => number`;
864
+ * `async () => 1` → `Promise<number>`). Literal não-fresh (keyof) é mantido.
865
+ */
866
+ declare function widenType(t: Schema): Schema;
867
+ /**
868
+ * A regra de widening do TS para o RESULTADO (const / retorno de chamada): alarga
869
+ * literais fresh em posição de **membro** (aninhados), mas mantém um literal fresh
870
+ * no **topo**. `id(1)` → `1`; `wrap(1)` (`T[]`) → `number[]`; `keys` (`keyof T`) →
871
+ * mantém (não-fresh).
872
+ */
873
+ declare function widenInferred(t: Schema): Schema;
874
+ /**
875
+ * O `getWidenedType` do tsc (`checker.ts:18112`) — ver o bloco acima. Aplica-se
876
+ * onde um tipo de expressão vira o tipo de um LUGAR: o candidato de uma inferência
877
+ * (o fim do `getCovariantInference`), uma declaração sem anotação
878
+ * (`widenTypeForVariableLikeDeclaration`) e o retorno inferido de uma função.
879
+ *
880
+ * Não confundir com o {@link widenType}, que é o widening de LITERAL (`1` → `number`)
881
+ * e roda em outros pontos: os dois são independentes, e o tsc também os separa.
882
+ */
883
+ declare function widenOrigin(t: Schema): Schema;
884
+
885
+ /**
886
+ * A forma de topo de um tipo impresso, para decidir parênteses. Um printer de tipo —
887
+ * este, do `Schema`, e o de type-node do `@tslite/format` — classifica o nó numa forma
888
+ * e pergunta à escada (`typeNeedsParens`): uma escada, duas renderizações.
889
+ */
890
+ type TypeForm = "function" | "conditional" | "union" | "intersection" | "operator" | "query" | "primary";
891
+ /**
892
+ * As posições da gramática de tipos e o que cada uma NÃO aceita sem parênteses — a
893
+ * escada do `factory/parenthesizerRules.ts` do tsc (`parenthesizeCheckTypeOfConditionalType`
894
+ * até `parenthesizeNonArrayTypeOfPostfixType`). Os ramos do conditional, o retorno de
895
+ * função, o elemento de tupla, a prop e o parâmetro aceitam qualquer tipo.
896
+ */
897
+ declare const NEEDS_PARENS: {
898
+ readonly check: Set<TypeForm>;
899
+ readonly extends: Set<TypeForm>;
900
+ readonly union: Set<TypeForm>;
901
+ readonly intersection: Set<TypeForm>;
902
+ readonly operand: Set<TypeForm>;
903
+ readonly postfix: Set<TypeForm>;
904
+ };
905
+ /** Uma posição da gramática de tipos (ver `NEEDS_PARENS`). */
906
+ type TypePosition = keyof typeof NEEDS_PARENS;
907
+ /** Um tipo de forma `form` precisa de parênteses na posição `pos`? */
908
+ declare const typeNeedsParens: (pos: TypePosition, form: TypeForm) => boolean;
909
+ /** Renderiza `schema` como uma string no estilo TypeScript. */
910
+ declare function format(schema: Schema, seen?: WeakSet<object>): string;
911
+ /**
912
+ * Os argumentos de tipo de uma lista (`A, B`, sem os `<>`), com a regra do 1º argumento
913
+ * (`(<T>(x: T) => T), B`). Para quem monta a lista fora de um `apply` — o argumento de
914
+ * tipo de uma chamada (`f<T>(x)`), no emissor de fonte.
915
+ */
916
+ declare function formatTypeArgs(args: readonly Schema[]): string;
917
+
918
+ /**
919
+ * `true` quando `schema` descreve **dado puro** (sobrevive a `JSON.stringify`
920
+ * sem perda silenciosa). `fn` é o ponto-chave: uma função é dropada em silêncio
921
+ * pela serialização — por isso `false`.
922
+ *
923
+ * `apply` é **conservador** (`false`): sem registro de construtores-de-dado
924
+ * liberados, não dá pra garantir que `Foo<…>` (ou `Promise<T>`, `Map<K,V>`)
925
+ * vire JSON. `var` (forma desconhecida), `any`/`unknown` (sem garantia) → `false`.
926
+ */
927
+ declare function isSerializable(schema: Schema, seen?: WeakSet<object>): boolean;
928
+
929
+ /** Um membro que pode seguir a partir de um tipo (item de autocomplete). */
930
+ interface Completion {
931
+ /** Nome da propriedade, ou `"[]"` para o elemento de um array. */
932
+ readonly key: string;
933
+ readonly type: Schema;
934
+ readonly optional: boolean;
935
+ }
936
+ /** Resultado de navegar um path: o tipo final + o que pode seguir dele. */
937
+ interface Discovery {
938
+ readonly type: Schema;
939
+ readonly completions: readonly Completion[];
940
+ }
941
+ /**
942
+ * Navega `path` a partir de `schema`. Retorna o tipo alcançado e suas
943
+ * completions, ou `null` se algum segmento não existir no tipo. Path vazio
944
+ * devolve o próprio tipo e suas completions.
945
+ */
946
+ declare function discover(schema: Schema, path: readonly string[], schemes?: Schemes): Discovery | null;
947
+
948
+ export { type AnySchema, type ApplySchema, type ArraySchema, type Bindings, type Completion, DEFAULT_TYPE_LIMITS, type Discovery, type ElementFlag, type FnSchema$1 as FnSchema, type GuardSig, INSTANTIATION_COUNT_LIMIT, INSTANTIATION_DEPTH_LIMIT, type Incompatibility, type IncompatibilityKind, type IndexSchema, type Instantiation, InstantiationLimitError, type KeyofSchema, type LiteralSchema, type MappedSchema, type ObjectSchema, type OverloadSchema, type Param, type Prop, type ScalarSchema, type Schema, type Schemes, TYPE_EVAL_DEPTH_LIMIT, type TupleSchema, TypeEvalLimitError, type TypeEvalLimits, type TypeForm, type TypePosition, type TypeScheme, type UnionSchema, UnionTooComplexError, type UnknownSchema, type VarCandidates, type VarSchema, apparentType, asLiteralOrigin, baseLiteralType, bindTypeParams, comparable, configureTypeLimits, contravariantInference, covariantInference, discover, equals, erasedSignature, expand1, flagAt, format, formatTypeArgs, formatTypeDiff, freeVars, groundVars, inferFromCandidates, inferredTypes, instantiate, instantiateInContextOf, instantiateLoose, isMissingType, isNumericLiteralName, isObjectOrArrayLiteral, isScheme, isSerializable, isVariadicTuple, join, joinAll, missingType, normalizeUnion, ownProp, renameTypeParams, resetInstantiationCount, resetTypeLimits, resolveConditional, resolveOp, resolveTypeOp, restIndex, s, sampleValue, silentNever, substitute, subtype, typeAtPosition, typeDiff, typeFeatures, typeLimits, typeNeedsParens, typeParamArity, unify, widen, widenInferred, widenLiteral, widenOrigin, widenType, withoutUndefined };