javascript - Verificări și declarații TypeScript în JS obișnuit


Deci practic aș dori să folosesc TypeScript pentru a-mi verifica codul în căutare de erori în timp ce îl editez (VS Code), dar nu vreau să fac niciun pas de transpilare.

Am codul meu în fișiere .js și "allowJs": true în tsconfig.json

Singura problemă este că editorul s-ar plânge de utilizarea cuvintelor din TypeScript în fișierele JS, de exemplu:

declare module "something" {
    export interface MyInterface {

Conduce la eroare:

 "'module' declarations can only be used in TypeScript files"

Am încercat să nu-mi pese, dar din păcate, asta duce de asemenea la o eroare atunci când rulez efectiv programul (node.js)!

SyntaxError: Unexpected strict mode reserved word
    at Loader.moduleStrategy (internal/modules/esm/translators.js:145:18)

Nu pot cumva să am verificări TS fără TS?

Știu că pot, adică e chiar acolo, dar apoi trebuie să șterg tot ce ține de TS înainte de lansarea aplicației.

Nu știu, poate cineva are un... transpiler pentru asta? :D

Surprinzător, nu există multe informații despre acest lucru pe Internet.

Motivele pentru care nu voi transpila TS în JS:

  • Petrece timp
  • Codul este un haos. Are funcții aleatorii pe care nu le-am scris niciodată, de asemenea „var” peste tot
  • Erorile au numere de linie din fișiere .JS care sunt generate automat (stricate)
  • De ce aș compila oricum un limbaj de scripting

Răspuns #1

Da, absolut poți. Și nici nu ai nevoie de fișiere de declarații TypeScript.

TypeScript va verifica cu plăcere codul tău JS simplu dacă ai setat flag-ul checkJs fie în configurația CLI, fie în fișierul tău tsconfig.json. allowJs de fapt nu are legătură cu asta, acesta doar impune dacă poți importa fișiere JS simple în fișiere TS/TSX (nu contează dacă imporți JS în JS). Anotarea JSDoc este de fapt o metodă excelentă de a combina cod JS simplu și cod TS într-o bază de cod mixtă, de exemplu dacă ești în procesul de migrare a codului de la JS la TS.

TypeScript (chiar și fără adnotări JSDoc) îți va oferi o mulțime de verificări de tip „implicite” utile fără a scrie sintaxă suplimentară, doar prin detectarea modului în care declari variabilele și presupunând că tipul lor nu ar trebui să se schimbe (printre alte deducții):

// Implicit TypeScript typing
let myBooleanValue = false;
myBooleanValue = 'true'; // Error: Type 'string' is not assignable to type 'boolean'.ts(2322)

Dacă vrei totuși și mai mult control, TypeScript este pe deplin compatibil cu adnotările de tip JSDoc. Asigură-te că citești documentația și folosești sintaxa corectă pentru comentarii (de exemplu /** ... */ și nu // ...). Practic nu există nimic ce poți face cu sintaxa TypeScript pe care să nu-l poți face cu JSDoc, este doar puțin mai detaliată:

// Explicit JSDoc typing
/**
 * @type {string}
 */
let myVar;
myVar = 7; // Error: Type 'number' is not assignable to type 'string'.ts(2322)

Poți deveni și mai avansat cu asta, declarând lucruri precum parametrii funcțiilor, structura obiectelor și câmpurile încorporate, valorile returnate și altele:

/**
 * @param {object} myParam
 * @param {number} myParam.myNumber
 * @returns {boolean} // Error: A function whose declared type is neither 'void' nor 'any' must return a value.ts(2355) (because nothing is currently returned from myFunction)
 */
function myFunction(myParam) {
  let myNumberCopy = myParam.myNumber;
  let myMissingPropertyCopy = myParam.myMissingProperty; // Error: Property 'myMissingProperty' does not exist on type '{ myNumber: number; }'.ts(2339)
}

Poți chiar să faci lucruri nebunești, cum ar fi să imporți tipuri din alte fișiere sau pachete și să le folosești în adnotările tale JSDoc:

/**
 * @type {import("React").FC}
 */
const MyComponent = () => null;

Iată fișierul tsconfig.json pe care l-am folosit pentru exemplele de mai sus, fără nimic în afară de pachetul NPM de bază typescript instalat:

{
  "compilerOptions": {
    "module": "es6",
    "noEmit": true,
    "checkJs": true,
    "moduleResolution": "node"
  },
  "include": ["src/**/*"]
}

Dovadă vizuală că totul funcționează foarte bine în VSCode:

Cu această configurație, un mod bun de a „testa” dacă ai erori de tip în întregul tău cod este să rulezi npx tsc --noEmit, care va rula verificarea TypeScript (inclusiv adnotările JSDoc) pentru toate fișierele tale, conform fișierului tău tsconfig.json.