allowImportingTsExtensions în TypeScript

Permite importuri cu extensia .ts ("./calcul.ts"), când codul este rulat direct de Node.js, Deno, Bun sau de un bundler.

Sintaxă
"compilerOptions": {
  "allowImportingTsExtensions": true,
  "noEmit": true
}

Ce face allowImportingTsExtensions

De obicei, în TypeScript scrii importul cu extensia fișierului generat: "./calcul.js". Uneltele care rulează direct fișiere .ts (Node.js 23.6+, Deno, Bun, Vite) au însă nevoie de numele real: "./calcul.ts". Cu allowImportingTsExtensions, tsc acceptă extensiile .ts, .mts, .cts și .tsx în importuri.

Opțiunea merge doar cu noEmit sau emitDeclarationOnly: tsc nu rescrie importurile, deci fișierele .js generate ar importa fișiere .ts (eroarea TS5096). tsc verifică doar tipurile, iar altă unealtă rulează codul. Dacă vrei și fișiere .js, folosește rewriteRelativeImportExtensions. Implicit: false.

Parametri

Parametru Descriere
true Importurile pot avea extensia .ts/.mts/.cts/.tsx. Necesită noEmit sau emitDeclarationOnly.
false Valoarea implicită; importul cu .ts dă TS5097.

Exemple

Exemplul 1: Verificare cu tsc, rulare cu Node.js

tsc verifică tipurile (fără să scrie fișiere), iar Node.js rulează direct index.ts, eliminând tipurile la încărcare.

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

// tsconfig.json
{
  "compilerOptions": {
    "module": "nodenext",
    "allowImportingTsExtensions": true,
    "noEmit": true
  }
}

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

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

console.log(cuTva(100));

Rezultat (tsc 5.9)

$ npx tsc && node index.ts
119

Exemplul 2: Fără opțiune sau fără noEmit

Primul rezultat: același cod, cu noEmit, dar fără allowImportingTsExtensions. Al doilea: cu opțiunea, dar fără noEmit.

// tsconfig.json
{
  "compilerOptions": {
    "module": "nodenext",
    "allowImportingTsExtensions": true
  }
}

Rezultat (tsc 5.9)

$ npx tsc          # fără allowImportingTsExtensions
index.ts(1,23): error TS5097: An import path can only end with a '.ts' extension when 'allowImportingTsExtensions' is enabled.

$ npx tsc          # cu opțiunea, dar fără noEmit
tsconfig.json(4,35): error TS5096: Option 'allowImportingTsExtensions' can only be used when either 'noEmit' or 'emitDeclarationOnly' is set.

Greșeli frecvente

  • Să folosești opțiunea și să publici fișiere .js generate de alt instrument care nu rescrie importurile. Ele vor importa .ts și nu vor merge.

Comenzi înrudite

  • rewriteRelativeImportExtensions: Rescrie importurile relative care se termină în .ts, .mts, .cts în .js, .mjs, .cjs în fișierele generate.
  • erasableSyntaxOnly: Interzice construcțiile TypeScript care generează cod (enum, namespace, parametri-proprietate), ca Node.js să poată rula direct fișierele .ts.
  • noEmit: tsc doar verifică tipurile și nu scrie niciun fișier (.js, .d.ts, .map).
  • moduleResolution: Alege regulile după care tsc găsește fișierul din spatele unui import („./calcul.js”, „react”, „@/utile”).