Unelte pentru TypeScript
Acest capitol este o trecere în revistă a uneltelor din jurul TypeScript: linting, formatare, unelte de build, configurarea editorului și testare.
Ecosistemul de dezvoltare TypeScript
Uneltele TypeScript sunt unul dintre cele mai mari atuuri ale limbajului. Există unelte solide pentru fiecare etapă a dezvoltării:
- Calitatea codului: ESLint cu suport pentru TypeScript, verificarea tipurilor și linting, impunerea stilului de cod.
- Dezvoltare: integrare cu VS Code, unelte de depanare, Hot Module Replacement (HMR).
- Build & livrare: bundlere (Vite, Webpack, Parcel), împachetarea modulelor, optimizare pentru producție.
Linting cu ESLint
Instalare. Instalează ESLint împreună cu parserul și pluginul oficiale pentru TypeScript, ca ESLint să înțeleagă sintaxa și regulile TypeScript: npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin.
Configurare. În .eslintrc.json activează regulile TypeScript recomandate, indică-i lui ESLint fișierul tsconfig pentru un linting care ține cont de tipuri și ajustează câteva reguli uzuale:
"root": true"parser": "@typescript-eslint/parser""plugins": ["@typescript-eslint"]"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended-requiring-type-checking"]"parserOptions": { "project": "./tsconfig.json", "ecmaVersion": 2020, "sourceType": "module" }"rules": { "@typescript-eslint/explicit-function-return-type": "warn", "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }] }
Scripturi NPM. Adaugă în package.json scripturi care rulează linterul și o verificare doar a tipurilor. Folosește lint:fix pentru a repara automat problemele simple.
"lint": "eslint . --ext .ts,.tsx""lint:fix": "eslint . --ext .ts,.tsx --fix""type-check": "tsc --noEmit"
Formatarea codului cu Prettier
Prettier păstrează același stil de cod în toată echipa.
Combină-l cu ESLint, ca problemele de formatare să nu apară drept erori de lint.
Instalare. Instalează Prettier și pachetele ESLint care dezactivează regulile conflictuale și raportează problemele de formatare prin ESLint: npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier.
Configurare. Pune-ți preferințele în .prettierrc, de exemplu:
"semi": true"singleQuote": true"tabWidth": 2"printWidth": 100"trailingComma": "es5""bracketSpacing": true"arrowParens": "avoid"
Iar folderele generate se trec în .prettierignore, câte unul pe linie: node_modules, build, dist, .next, .vscode.
Integrarea cu ESLint. Extinde plugin:prettier/recommended, ca problemele de formatare să fie raportate ca probleme ESLint. În .eslintrc.json adaugă-l în tabloul "extends", după toate celelalte configurații: "extends": ["plugin:prettier/recommended"]. Trebuie să fie ultima intrare din tablou.
Unelte moderne de build
Vite este alegerea recomandată pentru un server de dezvoltare rapid și build-uri moderne.
Webpack este încă des folosit și foarte configurabil.
Vite (recomandat). Creează un proiect nou React + TypeScript cu Vite. Pornește un server de dezvoltare cu HMR, pentru feedback rapid:
npm create vite@latest my-app -- --template react-ts— creează proiectulcd my-app— intră în folderul proiectuluinpm install— instalează dependențelenpm run dev— pornește serverul de dezvoltare
Configurarea Webpack. Dacă alegi Webpack, această configurație minimă compilează TypeScript, se ocupă de CSS și servește aplicația cu webpack-dev-server.
Configurarea TypeScript. Un tsconfig.json strict pentru browsere moderne. Opționalele baseUrl și paths permit importuri absolute precum @/components/Button. Secțiunea sa compilerOptions:
"target": "es2020""module": "esnext""lib": ["dom", "dom.iterable", "esnext"]"allowJs": true"skipLibCheck": true"esModuleInterop": true"allowSyntheticDefaultImports": true"strict": true"forceConsistentCasingInFileNames": true"moduleResolution": "node""resolveJsonModule": true"isolatedModules": true"noEmit": true"jsx": "react-jsx""baseUrl": ".""paths": { "@/*": ["src/*"] }
împreună cu "include": ["src"] și "exclude": ["node_modules"].
Configurație Webpack minimă
ts-loader se ocupă de fișierele .ts/.tsx, CSS-ul trece prin loaderele style și css, iar serverul de dezvoltare rulează pe portul 3000 cu reîncărcare la cald.
// webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.tsx',
module: {
rules: [
{
test: /\.(ts|tsx)$/,
use: 'ts-loader',
exclude: /node_modules/,
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
},
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html',
}),
],
devServer: {
static: path.join(__dirname, 'dist'),
compress: true,
port: 3000,
hot: true,
},
};
Configurarea mediului de dezvoltare
Configurează-ți editorul astfel încât să afișeze erorile de lint, să formateze la salvare și să permită depanarea ușoară.
Extensii VS Code. Extensii recomandate:
- TypeScript + Webpack Problem Matchers — raportare mai bună a erorilor
- ESLint — rulează ESLint în VS Code
- Prettier - Code formatter — formatare consecventă
- Path IntelliSense — completează automat numele de fișiere
- Error Lens — afișează erorile direct în cod
Setări VS Code. În .vscode/settings.json fă din Prettier formatorul implicit, repară problemele ESLint la salvare și preferă căile de import ne-relative:
"editor.defaultFormatter": "esbenp.prettier-vscode""editor.formatOnSave": true"editor.codeActionsOnSave": { "source.fixAll.eslint": true, "source.organizeImports": true }"eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"]"typescript.tsdk": "node_modules/typescript/lib""typescript.preferences.importModuleSpecifier": "non-relative"
Configurația de depanare. În .vscode/launch.json ("version": "0.2.0") adaugă două intrări în "configurations":
- O pornire Chrome:
"type": "chrome","request": "launch","name": "Launch Chrome against localhost","url": "http://localhost:3000","webRoot": "${workspaceFolder}","sourceMaps": true, și"sourceMapPathOverrides"care mapeazăwebpack:///./~/*la${workspaceFolder}/node_modules/*șiwebpack:///./*la${workspaceFolder}/src/*. - Un depanator Node pentru teste:
"type": "node","request": "launch","name": "Debug Tests","runtimeExecutable": "${workspaceRoot}/node_modules/.bin/jest","args": ["--runInBand", "--watchAll=false"],"console": "integratedTerminal","internalConsoleOptions": "neverOpen","sourceMaps": true.
Configurarea testelor
Jest împreună cu Testing Library este o modalitate populară de a testa aplicații React + TypeScript.
Jest + Testing Library. Instalează Jest, suportul său pentru TypeScript și utilitarele React Testing Library pentru aserțiuni pe DOM și interacțiunea utilizatorului: npm install --save-dev jest @types/jest ts-jest @testing-library/react @testing-library/jest-dom @testing-library/user-event.
Configurarea Jest. Configurează Jest să folosească ts-jest, să mapeze modulele CSS și să rezolve căile alias precum @/.
Test de exemplu. Un test simplu de componentă, care verifică randarea și comportamentul la clic cu Testing Library.
Configurarea Jest
Configurația folosește presetul ts-jest cu un mediu jsdom și mapează aliasul @/ și importurile de stiluri.
// jest.config.js
module.exports = {
preset: 'ts-jest',
testEnvironment: 'jsdom',
setupFilesAfterEnv: ['@testing-library/jest-dom'],
moduleNameMapper: {
'^@/(.*)$': '/src/$1',
'\\\.(css|less|scss|sass)$': 'identity-obj-proxy',
},
transform: {
'^.+\\\.tsx?$': 'ts-jest',
},
testMatch: ['**/__tests__/**/*.test.(ts|tsx)'],
};
Test de componentă cu Testing Library
Două teste: unul verifică faptul că textul butonului este randat, celălalt verifică faptul că handlerul de clic rulează o singură dată.
// src/__tests__/Button.test.tsx
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import Button from '../components/Button';
describe('Button', () => {
it('renders button with correct text', () => {
render(<Button>Click me</Button>);
expect(screen.getByRole('button', { name: /click me/i })).toBeInTheDocument();
});
it('calls onClick when clicked', () => {
const handleClick = jest.fn();
render(<Button onClick={handleClick}>Click me</Button>);
fireEvent.click(screen.getByRole('button'));
expect(handleClick).toHaveBeenCalledTimes(1);
});
});
Bune practici
Fluxul de lucru în dezvoltare:
- Folosește
npm run devpentru dezvoltare cu reîncărcare la cald - Rulează
npm run type-checkpentru a verifica tipurile TypeScript - Folosește
npm run lintpentru a căuta erori de linting - Rulează
npm run buildpentru a crea un build de producție
Optimizarea performanței:
- Folosește împărțirea codului (code splitting) cu importuri dinamice
- Activează tree-shaking în build-urile de producție
- Folosește
React.memoșiuseMemopentru calcule costisitoare - Încarcă leneș componentele necritice
Capcane frecvente
- Configurarea TypeScript: asigură-te că modul
stricteste activat - Conflicte ESLint + Prettier: folosește
eslint-config-prettierpentru a dezactiva regulile conflictuale - Build-uri lente: ia în calcul Vite sau esbuild pentru o dezvoltare mai rapidă
- Definiții de tipuri lipsă: instalează pachetele
@typespentru toate dependențele - Probleme de depanare: asigură-te că hărțile sursă (source maps) sunt configurate corect
Unelte recomandate
- Bundlere: Vite, Webpack, Parcel
- Testare: Jest, React Testing Library, Cypress
- Linting/Formatare: ESLint, Prettier, Stylelint
- Documentație: TypeDoc, Storybook
- Performanță: Web Vitals, Lighthouse