import type în TypeScript

Module și declarații TypeScript 3.8

Importă doar tipuri; importul dispare complet din JavaScript-ul generat.

Sintaxă
import type { Tip } from "./modul.mjs";
import { valoare, type Tip } from "./modul.mjs";
type T = import("./modul.mjs").Tip;

Ce face import type

import type { Elev } from "./elevi.mjs" importă doar informații de tip. Numele importat poate fi folosit în adnotări, dar nu ca valoare (nu poți face new cu el sau să-l afișezi). La compilare, întreaga linie este ștearsă, deci modulul nu este încărcat la rulare doar pentru un tip.

Din TypeScript 4.5 poți marca individual: import { citeste, type Elev } from "..." importă valoarea citeste și tipul Elev. Opțiunea verbatimModuleSyntax cere ca orice import folosit doar ca tip să fie marcat cu type, ca uneltele care compilează fișier cu fișier (esbuild, Babel, Node.js cu ștergerea tipurilor) să știe sigur ce să șteargă.

Forma import("./modul.mjs").Tip se poate scrie direct într-o adnotare, fără linie de import; este folosită mai ales în JSDoc și în fișierele .d.ts.

Exemple

Exemplul 1: Tipuri din modulele Node.js

Stats și ParsedPath sunt doar tipuri. Valorile (statSync, parse) se importă normal.

import type { Stats } from "node:fs";
import { statSync, writeFileSync } from "node:fs";
import { parse, type ParsedPath } from "node:path";

writeFileSync("note.txt", "Ana 10\nMihai 9\n");

function descrie(info: Stats, cale: ParsedPath): string {
    return `${cale.name}${cale.ext}: ${info.size} octeți, fișier: ${info.isFile()}`;
}

console.log(descrie(statSync("note.txt"), parse("./note.txt")));

Rezultat

note.txt: 15 octeți, fișier: true

Exemplul 2: Un tip importat nu poate fi folosit ca valoare

import type { EventEmitter } from "node:events";
const e = new EventEmitter();
console.log(e);

Eroarea afișată de tsc

exemplu.mts(2,15): error TS1361: 'EventEmitter' cannot be used as a value because it was imported using 'import type'.

Exemplul 3: import() direct în adnotare

function afiseaza(u: import("node:url").URL): string {
    return `${u.hostname}${u.pathname}`;
}

console.log(afiseaza(new URL("https://dexblog.ro/invata/typescript/")));

Rezultat

dexblog.ro/invata/typescript/

Greșeli frecvente

  • Imporți cu import type o clasă pe care apoi o folosești cu instanceof sau new. Ai nevoie de importul normal.
  • Compilezi cu esbuild un import de tip nemarcat dintr-un modul care nu există la rulare. Marchează-l cu type sau activează verbatimModuleSyntax ca tsc să te oblige.

Comenzi înrudite

  • export type: Exportă tipuri dintr-un modul; forma export type { … } re-exportă doar tipuri, fără cod la rulare.
  • module și import/export: Fiecare fișier cu import sau export este un modul; exporți funcții, clase și tipuri și le imporți în alte fișiere.
  • fișiere .d.ts: Fișiere care conțin doar tipuri: descriu codul JavaScript ca să poată fi folosit din TypeScript cu verificare.
  • verbatimModuleSyntax: Importurile rămân exact cum sunt scrise; se șterg doar cele marcate cu type, deci tipurile trebuie importate cu import type.