babeljs - elimină adnotările TypeScript fără alte transpilări (inclusiv propunerile Stage 3) și păstrează întreruperile de linie


Cum pot elimina toate tipurile TS și adnotările de tip dintr-un modul TS 3.9 fără a efectua nicio altă transpilare (inclusiv câmpurile private de clasă precum #foo) și păstrând în același timp întreruperile de linie din codul meu original?

Contribui la un proiect OSS care folosește JS simplu cu propuneri Stage 3, dar aș dori să îmi scriu codul în TypeScript și să folosesc un pas de construire automatizat pentru a elimina toate adnotările TS și a obține un fișier .mjs pe care să îl pot verifica în upstream.

Codul meu nu folosește niciun fel de caracteristici TS (de exemplu, namespace-uri, enumuri) care să aibă un impact la rulare. Folosesc TS doar pentru verificarea tipurilor.

Până acum am încercat atât TSC, cât și Babel, dar fiecare dintre ele are probleme.

Iată versiunea TSC:

tsc src/lib/LocalDateTime.ts --lib ESNext --target ESNext --module ESNext --isolatedModules --declaration --allowSyntheticDefaultImports --moduleResolution node --useDefineForClassFields true
mv code.js code.mjs

TSC lasă tot codul meu neatins, dar nu păstrează liniile noi. Fără spațiere între blocurile de cod, codul rezultat este mult mai greu de citit și nu este potrivit pentru a fi verificat upstream.

TSC de asemenea strică indentarea, dar prettier poate să remedieze asta. Singurele lucruri pe care trebuie să le păstrez sunt întreruperile de linie. Nu mă interesează formatele post-TSC care încearcă să adauge întreruperi de linie automat. Vreau doar să păstrez întreruperile de linie originale din codul meu original.

Iată o configurație Babel 7.10 care este, de asemenea, aproape funcțională:

{
  "retainLines": true,
  "plugins": ["@babel/plugin-proposal-class-properties"],
  "presets": [
    [
      "@babel/preset-typescript",
      {
        "allowNamespaces": false,
        "onlyRemoveTypeImports": true
      }
    ]
  ]
}

Acea configurație lasă întreruperile mele de linie neschimbate (bine!) dar de asemenea transpilează utilizarea câmpurilor private de clasă Stage 3, ceea ce este rău pentru că vreau să păstrez sintaxa proprietății native #foo în rezultatul JS. Vreau doar ca codul meu de runtime să rămână neschimbat, dar părțile TS să fie eliminate.

Cum?

Răspuns #1

Am un sentiment că dezvoltarea în acest mod se va întoarce împotriva ta, și rapid, dar poți configura babel să analizeze, dar să nu transforme, majoritatea sintaxelor. Folosind un set paralel de pluginuri,

În acest caz, change @babel/plugin-proposal-class-properties devine @babel/plugin-syntax-class-properties

.babelrc.json

{
  "retainLines": true,
  "plugins": ["@babel/plugin-syntax-class-properties"],
  "presets": [
    [
      "@babel/preset-env",
      "@babel/preset-typescript",
      {
        "allowNamespaces": false,
        "onlyRemoveTypeImports": true
      }
    ]
  ]
}

Iată un exemplu în repl.