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