Pular para o conteúdo

Comparação com TypeScript

Dois sistemas de tipos com filosofias diferentes: um apaga na compilação, o outro confere também em execução.

A comparação certa não é de sintaxe — é de onde o tipo vive. O TypeScript apaga tudo antes de rodar: o tipo é um contrato entre quem escreve e quem lê, e no JSON.parse ele acaba. Em DataForge o tipo declarado é conferido também na fronteira em execução, e é por isso que ele pega o que um any mal colocado deixa passar.

A tabela#

TypeScriptDataForgeNota
type Id = numbertype Id := Integeralias nos dois
type N = number \| stringtype N := Integer \| Stringunião nos dois
A & BA & Binterseção nos dois
branded type por convençãoopaque type Cpf := Stringaqui é mecanismo, não convenção
— (não existe)Integer where valor bigger 0refinamento conferido
function f<T>(x: T): Taction f<T>(x: T) -> Tsem limite, nenhum dos dois cobra
<T extends number><T extends Number>cobrado nas duas metades
interfacetrait
readonly / as constrecordimutável por construção
enumenumcom método, aqui
x?.y / x ?? yx?.y / x ?? yiguais
tsc --noEmitdataforge checkembutido, sem instalar nada
as anynão anotaro analisador cala, e isso é dito

A diferença que mais aparece#

dataforge
type Positivo := Integer where valor bigger 0

action cobrar(v: Positivo) -> Integer:
    yield v * 100

// Isto passa: 7 satisfaz a regra.
assert cobrar(7) is 700

// E isto e RECUSADO em execucao, nao so no editor — que e o que um
// 'as any' do TypeScript nao impede.
recusou := no
monitor:
    cobrar(0 - 5)
handle Error as e:
    recusou := yes
assert recusou
out "o refinamento vale onde o dado chega de fora"

O que o TypeScript tem e DataForge não#

  • Tipos condicionais e mapeados — T extends U ? A : B, Partial<T>, Record<K,V>.
  • Inferência de fluxo tão fina quanto — o narrowing do TS por typeof e in é mais completo.
  • Tipos literais de template — ` on${Capitalize<E>} `.
  • Ecossistema de tipos — o DefinitelyTyped não tem equivalente aqui.

O que DataForge tem e o TypeScript não#

  • Refinamento conferido (where) — no TS é convenção e uma função guarda.
  • Tipo opaco de verdade — o branded type do TS some na compilação.
  • O tipo atravessa `adopt` — a aridade e os tipos dos parâmetros são conferidos entre arquivos, antes de rodar.
  • A conferência em execução — o tipo não desaparece quando o dado vem de um JSON.