Typový systém TypeScript zachycuje smysluplnou třídu chyb před spuštěním kódu, neshody typů, chybějící vlastnosti, nesprávné signatury funkcí. Co však zachytit nedokáže, je všechno ostatní: bezpečnostní zranitelnosti, které závisí na tom, jak data proudí aplikací, architektonické chyby, které se časem hromadí, jak se hranice týmů stírají, mrtvé exporty, které zůstávají v kódové základně dlouho po odstranění jejich volajících metod, a chyby asynchronního programování, které se správně zkompilují, ale za určitých běhových podmínek selžou. Nástroje pro statickou analýzu tyto mezery vyplňují a výběr správné kombinace závisí na tom, co se vlastně snažíte najít.
Tato příručka se zabývá nástroji, které jsou pro TypeScriptové týmy v roce 2026 důležité: vrstvou lintingu (ESLint s typescript-eslint, Biome, OxcLint), bezpečnostní vrstvou (Semgrep, Snyk Code, SonarQube), architektonickou vrstvou (Dependency-Cruiser, Deptrac, Nx), vrstvou mrtvého kódu (Knip) a vrstvou hloubkové analýzy (ts-morph, samotný kompilátor TypeScript). U každé z nich se zaměřujeme na to, co vlastně dělá, jak ji konfigurovat a kdy není pro daný úkol vhodným nástrojem.
Vytvořeno pro kódové základny, kterým nikdo nerozumí
SMART TS XL automaticky zobrazuje změny, které narušují celou vaši kódovou základnu.
Zjistěte VÍCENástroje pro statickou analýzu TypeScript: Srovnávací tabulka
Než se ponoříme do jednotlivých nástrojů, níže uvedená tabulka popisuje každý nástroj podle jeho primární funkce, vhodnosti pro CI a ideálního případu použití. Žádný nástroj nepokrývá všechny dimenze, efektivní analýza kvality TypeScriptu vyžaduje vrstvení několika nástrojů.
| Nástroj | Primární funkce | Vhodné pro CI | Stát | nejlepší |
|---|---|---|---|---|
| ESLint + TypeScript-eslint | Linting, styl, pravidla pro typově orientované texty | Ano | Zdarma | Celotýmové konvence, bezpečnost asynchronních typů |
| Biom | Linting + formátování | Ano | Zdarma | ESLint + Hezčí náhrada, rychlost |
| OxcLint | Linting (kompatibilní s ESLint) | Ano | Zdarma | Monorepozitáře vyžadující rychlé zpracování textu |
| Kompilátor TypeScriptu (tsc) | Kontrola typů | Ano | Zdarma | Chyby typu, vynucování striktního režimu |
| Semgrep | SAST, vlastní vzory | Ano | Zdarma + placené | Bezpečnostní skenování, vlastní organizační pravidla |
| Snykův kód | SAST, zabezpečení závislostí | Ano | Zdarma + placené | Týmy zaměřené na bezpečnost, integrace IDE |
| SonarQube / SonarCloud | Kvalitní brány, sledování trendů | Ano | Zdarma + placené | Řídicí panely kvality podniku |
| SonarLint | Zpětná vazba kvality na úrovni IDE | Pouze IDE | Zdarma | Vložené bezpečnostní a kvalitativní tipy |
| Dependency-Cruiser | Vynucení grafu závislostí | Ano | Zdarma | Ověření architektonických pravidel |
| Deptrac | Vynucení hranic vrstev | Ano | Zdarma | Čistá architektura, hranice DDD |
| Nx | Správa závislostí Monorepo | Ano | Zdarma + placené | Hranice modulů Monorepo |
| Střih | Mrtvý kód a nepoužívané exporty | Ano | Zdarma | Snižování nepoužívaného kódu ve velkém měřítku |
| ts-morf | Analýza programatických TS AST | Selektivní | Zdarma | Vlastní analýza, úpravy kódu, nástroje |
Vrstva 1: Linting a styl
ESLint s TypeScript-eslint
ESLint zůstává základem lintingu v TypeScriptu. S typescript-eslint Balíček získává přístup k informacím o typu TypeScript a může vynucovat pravidla, která vyžadují kontext typu, z nichž nejcennější jsou asynchronní pravidla, která zachycují běžné chyby Promise.
praštit
npm install --save-dev typescript-eslint
javascript
// eslint.config.js
import tseslint from "typescript-eslint";
export default tseslint.config(
...tseslint.configs.strictTypeChecked,
{
languageOptions: {
parserOptions: {
project: true,
tsconfigRootDir: import.meta.dirname,
},
},
rules: {
// Async safety rules -- highest value TypeScript-specific rules
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/no-misused-promises": "error",
"@typescript-eslint/require-await": "warn",
// Type safety
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-unsafe-assignment": "error",
"@typescript-eslint/no-unsafe-return": "error",
},
}
);
Čtyři výše uvedená asynchronní pravidla představují pravidla s nejvyšší přidanou hodnotou, která TypeScript-eslint poskytuje oproti prostému ESLintu. Zachycují: neošetřené Promisy (plovoucí promisy), await aplikováno na hodnoty, které nejsou Promise, Promise předávané zpětným voláním očekávajícím synchronní funkce a asynchronní funkce, které nikdy nepoužívají awaitJedná se o vzory, které se čistě kompilují, ale za určitých podmínek způsobují selhání za běhu.
Co ESLint nedokáže : analýzu datového toku mezi soubory, vynucování architektonických hranic, sledování bezpečnostních narušení ani detekci nefunkčního exportu. Pro tyto účely jsou vyžadovány níže uvedené vrstvy.
Biome: Moderní ESLint + hezčí náhrada
Biome nahrazuje ESLint i Prettier jedním binárním souborem založeným na Rustu, který běží 25–35krát rychleji. Podporuje JavaScript, TypeScript, JSX a JSON. Pro nové projekty nebo týmy frustrované složitostí pluginů ESLint a pomalým výkonem ve velkých kódových základech je Biome nejsilnější moderní alternativou.
praštit
npm install --save-dev --save-exact @biomejs/biome
npx @biomejs/biome init
praštit
# Check and format in one pass
npx @biomejs/biome check --write src/
# CI mode -- no modifications, exit non-zero on any finding
npx @biomejs/biome ci src/
Pluginový ekosystém Biome je menší než v ESLintu, což je důležité pro týmy s rozsáhlými vlastními pravidly nebo pluginy specifickými pro daný framework. Pro týmy, které používají pouze základní pravidla ESLintu a formátování Prettier, poskytuje Biome ekvivalentní pokrytí za zlomek doby provádění.
OxcLint: Kompatibilita s ESLint na prvním místě rychlosti
OxcLint (součást projektu Oxc) spouští pravidla kompatibilní s ESLint s 50–100krát rychlejším spuštěním. Nenahrazuje celý ekosystém ESLint, ale slouží jako nejrychlejší možnost pro CI pipelines, kde je doba zpracování lintů úzkým hrdlem.
praštit
npm install --save-dev oxlint
npx oxlint src/
OxcLint je správnou volbou pro velké monorepozitáře, kde standardní ESLint trvá minuty a latence zpětné vazby snižuje kvalitu pull requestů. Funguje nejlépe společně s ESLint, než aby ho nahrazoval. Pro rychlou cestu zpětné vazby používejte OxcLint a ESLint pro plné pokrytí pravidel v pre-merge bráně.
Vrstva 2: Kontrola typů, kompilátor TypeScript
Kompilátor TypeScript (tsc) není jen nástroj pro sestavení, je to primární nástroj pro statickou analýzu správnosti na úrovni typů. Povolení striktního režimu aktivuje nastavení, která zachycují většinu reálných chyb:
json
{
"compilerOptions": {
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"exactOptionalPropertyTypes": true,
"useUnknownInCatchVariables": true
}
}
praštit
# Type-check only, no emit -- ideal for CI
npx tsc --noEmit
noUnusedLocals a noUnusedParameters na úrovni kompilátoru zachytit nepoužívané proměnné a parametry funkcí. useUnknownInCatchVariables (TypeScript 4.4+) typy zachycovaly výjimky jako unknown spíše než any, čímž se před použitím vynucuje explicitní zúžení typu.
Analýza toku ovládacích prvků TypeScript je vestavěná funkce, kterou kompilátor poskytuje pro zúžení typů v rámci podmíněných větví. Není to samostatný nástroj, který umožňuje strict režim zajišťuje, že je aplikován s plnou přesností. Analýza toku řízení kompilátorem rozumí typovým strážcům, typeof šeky, instanceofa diskriminované vzorce odborů.
Omezení tsc : kompilátor TypeScript nenachází bezpečnostní zranitelnosti, narušení architektonických hranic ani nefunkční exporty. Nachází typové chyby a dělá to definitivně.
Vrstva 3: Zabezpečení, SAST pro TypeScript
Semgrep: Bezpečnostní skenování založené na vzorcích
Semgrep vyhledává bezpečnostní zranitelnosti pomocí porovnávání vzorů kódu. V případě TypeScriptu dokáže detekovat SQL injection, XSS, pevně zakódované přihlašovací údaje a nebezpečné... eval použití, znečištění prototypů a nezabezpečené konfigurace Express.js, vzory, které se sice správně kompilují, ale zavádějí zneužitelné zranitelnosti.
yaml
# Custom rule: flag user input in SQL queries (TypeScript)
rules:
- id: ts-sql-injection-risk
patterns:
- pattern: |
const query = `SELECT ... ${$USER_INPUT} ...`;
message: "User input directly interpolated into SQL -- use parameterized queries"
languages: [typescript]
severity: ERROR
praštit
# Run with the community TypeScript security rules
semgrep scan --config=p/typescript --config=p/owasp-top-ten src/
Semgrep doplňuje ESLint, nikoliv s ním konkuruje. ESLint vynucuje konvence; Semgrep nachází bezpečnostní anti-vzory. Většina TypeScriptových týmů, kterým záleží na bezpečnosti, by měla používat oba.
Snykový kód: SAST založený na strojovém učení s integrací IDE
Snyk Code provádí SAST pomocí analytického enginu založeného na strojovém učení, který sleduje toky kontaminovaných dat napříč soubory. Integruje se do IDE VS Code a JetBrains a zobrazuje zjištění přímo v kódu, aniž by čekali na spuštění CI.
praštit
npm install --save-dev snyk
npx snyk auth
npx snyk code test
Zaměření Snyk Code na vývojářské prostředí, zpětná vazba přímo v IDE, návrhy na opravy u každého zjištění a příklady nápravy z něj činí lepší volbu v situacích, kdy je bezpečnostní vzdělávání stejně důležité jako detekce bezpečnostních rizik.
SonarQube a SonarLint: Kontroly kvality a sledování trendů
SonarQube poskytuje průběžnou analýzu kvality kódu s dashboardem, sledováním trendů a dekorací pull requestů. V TypeScriptu detekuje chyby, „pach“ kódu, bezpečnostní hotspoty a duplikáty. SonarLint je rozšíření IDE, které lokálně zobrazuje pravidla SonarQube.
Pro týmy TypeScript je jednodušší cestou SonarCloud (cloudová verze): zdarma pro veřejné repozitáře s integrací CI prostřednictvím GitHub Actions nebo GitLab CI během několika minut.
yaml
# .github/workflows/sonar.yml
- name: SonarCloud Scan
uses: SonarSource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
Hlavní výhodou SonarQube oproti raw lintingu je jeho trendový model: jak se v čase vyvíjí kvalita kódu, které komponenty se zhoršují a jaké je skóre kvality nového kódu pro každý pull request. Tyto metriky zaměřené na správu jsou to, co SonarQube dělá, zatímco ESLint a Semgrep to nedokážou.
Vrstva 4: Architektonická analýza
Dependency-Cruiser: Vynucení pravidel pro hranice modulů
Dependency-Cruiser ověřuje, zda graf importu splňuje definovaná architektonická pravidla. Generuje vizuální grafy závislostí a neprovádí CI, pokud kód poruší omezení hranic modulu.
javascript
// .dependency-cruiser.cjs
module.exports = {
forbidden: [
{
name: "no-circular",
severity: "error",
comment: "Circular dependencies make code hard to test and maintain",
from: {},
to: { circular: true },
},
{
name: "no-ui-in-domain",
severity: "error",
comment: "Domain modules must not import from UI layer",
from: { path: "^src/domain" },
to: { path: "^src/ui" },
},
{
name: "no-external-in-shared",
severity: "warn",
comment: "Shared utilities should minimize external dependencies",
from: { path: "^src/shared" },
to: { pathNot: "^(src|node_modules/(lodash|date-fns))" },
},
],
};
praštit
npx depcruise --validate .dependency-cruiser.cjs src/
Dependency-Cruiser přímo řeší dotazy „nástroje pro analýzu závislostí v React CLI“ v datech Search Console a je standardním nástrojem pro generování a ověřování grafů závislostí v projektech TypeScript/React.
Deptrac: Vynucování hranic na základě vrstev
Deptrac vynucuje architektonické vrstvy, čímž zajišťuje, že persistence kódu nemůže být importována z prezentace, že doménové objekty nezávisí na infrastruktuře a že hranice modulů jsou respektovány v celé kódové základně.
yaml
# deptrac.yaml
parameters:
layers:
- name: Domain
collectors:
- type: directory
value: src/domain
- name: Application
collectors:
- type: directory
value: src/application
- name: Infrastructure
collectors:
- type: directory
value: src/infrastructure
ruleset:
Domain:
- ~Infrastructure # Domain must not depend on Infrastructure
Application:
- Domain
Infrastructure:
- Application
- Domain
Deptrac je nejcennější v projektech podle vzorů čisté architektury, DDD nebo hexagonální architektury, kde je izolace vrstev konstrukčním omezením, nikoli pouze preferencí.
Nx: Správa závislostí na úrovni monorepozitáře
Pro monorepozitáře TypeScript poskytuje Nx vynucování hranic modulů, detekci ovlivněných sestavení a vizualizaci grafu závislostí napříč všemi projekty v repozitáři.
json
// .eslintrc.json -- Nx module boundary rules
{
"rules": {
"@nx/enforce-module-boundaries": [
"error",
{
"allow": [],
"depConstraints": [
{ "sourceTag": "scope:shared", "onlyDependOnLibsWithTags": ["scope:shared"] },
{ "sourceTag": "scope:feature", "onlyDependOnLibsWithTags": ["scope:shared", "scope:feature"] },
{ "sourceTag": "scope:app", "onlyDependOnLibsWithTags": ["scope:shared", "scope:feature"] }
]
}
]
}
}
Nx affected Příkazy spouštějí pouze testy a linting relevantní pro změněné moduly, což výrazně zkracuje dobu CI ve velkých monorepozitářích.
Vrstva 5: Detekce nefunkčního kódu
Knip: Nalezení nepoužívaných exportů, souborů a závislostí
Knip analyzuje celý graf modulů a identifikuje nepoužívané exporty, nepoužívané soubory a nepoužívané package.json závislosti, třída akumulace kódu, kterou ESLint no-unused-vars nemůže zachytit, protože hledá pouze v souboru.
praštit
npm install --save-dev knip
npx knip
json
// knip.json
{
"entry": ["src/index.ts", "src/**/*.test.ts"],
"project": ["src/**/*.ts"],
"ignore": ["src/generated/**"],
"ignoreDependencies": ["vitest"]
}
Knip se v datech SC přímo vyhledává jako „detekce mrtvého kódu, nevyužité exporty, javascript, typescript“. Je to současný nejschopnější nástroj pro identifikaci mrtvého kódu na úrovni modulů v projektech TypeScript.
Vrstva 6: Programová analýza, ts-morph
ts-morph je API obal kompilátoru TypeScript, který usnadňuje psaní vlastních analýz, úprav kódu a nástrojů pro TypeScript AST. V datech SC se vyhledává přímo jako „ts-morph“ a „ts morph“.
strojopis
import { Project } from "ts-morph";
const project = new Project({ tsConfigFilePath: "tsconfig.json" });
// Find all async functions that never await anything
const suspiciousAsyncFns: string[] = [];
for (const sourceFile of project.getSourceFiles()) {
for (const fn of sourceFile.getFunctions()) {
if (fn.isAsync()) {
const hasAwait = fn.getDescendantsOfKind(
SyntaxKind.AwaitExpression
).length > 0;
if (!hasAwait) {
suspiciousAsyncFns.push(
`${sourceFile.getFilePath()}:${fn.getName() ?? "anonymous"}`
);
}
}
}
}
console.log("Async functions with no await:", suspiciousAsyncFns);
ts-morph není analytický nástroj připravený k okamžitému spuštění, je to knihovna, kterou použijete k jeho sestavení. Je vhodný pro týmy, které potřebují vlastní analýzu nad rámec toho, co podporují stávající nástroje: migrační skripty, vlastní architektonické validátory, automatizovaný refaktoring nebo kanály pro generování kódu.
Statická analýza asynchronních/čekajících parametrů v TypeScriptu
Data ze Search Console ukazují specifický shluk dotazů týkajících se „typescript static analysis async await paper tool“ a „typescript static analysis async await vulnerability paper tool“. Tyto dotazy odrážejí zájem odborníků o nástroje, které rozumí chybám asynchronního programování na úrovni typu.
Praktickým řešením pro produkční týmy TypeScript jsou čtyři asynchronní pravidla typescript-eslint (no-floating-promises, await-thenable, no-misused-promises, require-await) v kombinaci s strictNullChecks a useUnknownInCatchVariablesSpolečně tyto funkce zachycují nejběžnější chyby asynchronního typu bez nutnosti použití akademických výzkumných nástrojů.
Pro týmy provádějící bezpečnostní výzkum asynchronních zranitelností jsou TAJS a Jelly akademickými statickými analyzátory, které modelují sémantiku asynchronního provádění JavaScriptu, ale jsou to výzkumné nástroje, nikoli nástroje pro vývoj v produkčním prostředí.
Angular a React: Statická analýza specifická pro daný framework
Pro týmy Angularu, @angular-eslint poskytuje pravidla lintingu specifická pro Angular, která zahrnují vzory komponent, analýzu šablon a vkládání služeb. Integruje se s výše uvedenou konfigurací ESLint + typescript-eslint.
Pro týmy Reactuse eslint-plugin-react, eslint-plugin-react-hooks, a eslint-plugin-jsx-a11y Pluginy pokrývají specifické vzory pro React. Dependency-Cruiser zpracovává analýzu grafů závislostí specifických pro React a je nástrojem, který stojí za dotazy „nástroje cli pro analýzu závislostí React“ v datech SC.
Integrace IDE: Nástroje pro VS Code a JetBrains
Dotazy „nejlepší nástroje pro kvalitu kódu pro integraci VS Code“ a „nejlepší nástroje pro kvalitu kódu pro integraci IDE“ odrážejí skutečnou potřebu: zpětná vazba z CI přichází příliš pozdě na to, aby změnila chování. Analýza integrovaná do IDE poskytuje nejužší smyčku zpětné vazby.
VS Code : Rozšíření ESLint s paritou Clippy pro analyzátor rust, rozšíření SonarLint pro inline pravidla SonarQube, rozšíření Snyk pro bezpečnostní zjištění a vestavěná služba jazyka TypeScript pro zpětnou vazbu na úrovni typů.
JetBrains (WebStorm/IntelliJ) : WebStorm je dodáván s vestavěnou podporou TypeScript, která zobrazuje typové chyby přímo v textu, a s integrací s ESLint, Prettier a SonarLint. Vestavěný inspekční systém pokrývá mnoho stejných vzorů jako pravidla ESLint.
Konfigurace VS Code pro maximální pokrytí statickou analýzou TypeScript :
json
// .vscode/settings.json
{
"typescript.tsdk": "node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"eslint.validate": ["javascript", "typescript", "typescriptreact"],
"sonarlint.connectedMode.project": {
"connectionId": "my-sonarcloud",
"projectKey": "my-org_my-project"
}
}
Jak SMART TS XL Rozšiřuje analýzu TypeScriptu na celý podnik
Výše uvedené nástroje pokrývají TypeScript v rámci projektu TypeScript. V organizacích, kde služby TypeScript interagují s dávkovými programy COBOL, API Java, datovými kanály Pythonu nebo staršími mainframe systémy, nástroje pro jeden jazyk nevidí závislosti, které překračují hranice jazyků.
SMART TS XLJe statická analýza kódu Pokrývá TypeScript spolu se všemi ostatními jazyky v podnikovém prostředí, jako je COBOL, JCL, Java, Python, RPG, SQL, a vytváří jednotný model závislostí napříč všemi nimi. Když služba TypeScript volá API, které je podporováno programem v COBOLu, SMART TS XL může tento vztah vysledovat a zahrnout ho do analýza dopadu před provedením jakékoli změny na kterékoli z komponent.
Díky podpůrnému vyhledávání je možné dotazovat celou vícejazyčnou kódovou základnu: během několika sekund najdete každý import specifického modulu z TypeScriptu, každou metodu Java, kterou volá služba TypeScript, každou sešit COBOLu, která dodává data do API využívaného TypeScriptem, a to napříč miliony řádků kódu v libovolné kombinaci jazyků.
Pro podnikové týmy, které používají TypeScript jako jeden jazyk v rámci většího portfolia, SMART TS XL zajišťuje architektonickou viditelnost a vzájemnou komunikaci mezi jazyky mapování závislostí což nutí nástroje specifické pro TypeScript dívat se na svou část systému, zatímco SMART TS XL vidí celek.
Budování správného zásobníku
Žádný nástroj nepokrývá všechny aspekty kvality pro TypeScript. Správný přístup je vrstvený, přičemž každá vrstva se zaměřuje na odlišnou třídu problémů:
Minimální použitelný stack (nový projekt, malý tým):
- Striktní režim TypeScriptu
- ESLint s asynchronními pravidly TypeScript-eslint
npm auditpro zranitelnosti závislostí
Produkční aplikační stack (střední tým, zaměřený na bezpečnost):
- Vše výše uvedené plus:
- Biome nebo Prettier pro formátování
- Semgrep pro zabezpečení SAST
- Knip pro mrtvý kód
- SonarCloud pro viditelnost trendů kvality
Enterprise / monorepo stack (velký tým, architektonická omezení):
- Vše výše uvedené plus:
- Dependency-Cruiser pro vynucování hranic modulů
- Nx pro optimalizaci sestavení ovlivněného monorepozitářem
- Deptrac pro validaci hranic vrstev
- SonarQube (vlastní hosting) pro lokální kontroly kvality
Enterprise stack Polyglot (TypeScript vedle starších systémů):
- Vše výše uvedené plus:
- SMART TS XL pro analýzu dopadu na více jazyků a mapování závislostí