rewriteRelativeImportExtensions în TypeScript

Rescrie importurile relative care se termină în .ts, .mts, .cts în .js, .mjs, .cjs în fișierele generate.

Sintaxă
"compilerOptions": { "rewriteRelativeImportExtensions": true }

Ce face rewriteRelativeImportExtensions

Cu rewriteRelativeImportExtensions poți scrie importurile cu extensia reală ("./calcul.ts"), iar tsc le transformă în "./calcul.js" când generează JavaScript. Același cod sursă merge astfel în ambele feluri: rulat direct cu Node.js (node src/index.ts) și compilat în dist/.

Se rescriu doar căile relative (care încep cu ./ sau ../). Pentru importuri dinamice cu o cale calculată la rulare, tsc adaugă o funcție ajutătoare (__rewriteRelativeImportExtension) care face înlocuirea la rulare. Opțiunea permite automat importurile cu .ts, fără allowImportingTsExtensions. Implicit: false.

Parametri

Parametru Descriere
true Extensiile .ts/.mts/.cts din importurile relative sunt rescrise la generare.
false Valoarea implicită.

Exemple

Exemplul 1: Același cod, rulat în două feluri

Importul din sursă are .ts; în dist/index.js devine .js. Ambele variante rulează și dau același rezultat.

// package.json
{ "type": "module" }

// tsconfig.json
{
  "compilerOptions": {
    "module": "nodenext",
    "target": "es2022",
    "rewriteRelativeImportExtensions": true,
    "outDir": "dist"
  }
}

// src/calcul.ts
export function cuTva(pret: number): number {
  return Math.round(pret * 1.19 * 100) / 100;
}

// src/index.ts
import { cuTva } from "./calcul.ts";

console.log(cuTva(100));

Rezultat (tsc 5.9)

$ npx tsc && cat dist/index.js
import { cuTva } from "./calcul.js";
console.log(cuTva(100));

$ node dist/index.js
119

$ node src/index.ts
119

Exemplul 2: Import dinamic cu cale calculată

Calea este într-o variabilă, deci tsc nu o poate rescrie la compilare. Adaugă o funcție care o rescrie la rulare.

// src/index.ts
const fisier = "./calcul.ts";
const m = await import(fisier);
console.log(m.cuTva(100));

Rezultat (tsc 5.9)

$ npx tsc && cat dist/index.js
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
    if (typeof path === "string" && /^\.\.?\//.test(path)) {
        return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
            return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
        });
    }
    return path;
};
const fisier = "./calcul.ts";
const m = await import(__rewriteRelativeImportExtension(fisier));
console.log(m.cuTva(100));
export {};

Greșeli frecvente

  • Să te aștepți ca opțiunea să rescrie și căile din paths sau din pachete. Rescrie doar căile relative.

Comenzi înrudite

  • allowImportingTsExtensions: Permite importuri cu extensia .ts („./calcul.ts”), când codul este rulat direct de Node.js, Deno, Bun sau de un bundler.
  • erasableSyntaxOnly: Interzice construcțiile TypeScript care generează cod (enum, namespace, parametri-proprietate), ca Node.js să poată rula direct fișierele .ts.
  • module: Alege formatul de module din JavaScript-ul generat (ES modules, CommonJS) și regulile de import pe care le verifică tsc.
  • outDir: Directorul în care tsc scrie fișierele generate, cu aceeași structură de subdirectoare ca sursele.