20 nástrojů pro statickou analýzu, které potřebuje každý tým TypeScript

Nástroje pro statickou analýzu TypeScript: Kompletní průvodce pro vývojové týmy

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ÍCE

Ná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ástrojPrimární funkceVhodné pro CIStátnejlepší
ESLint + TypeScript-eslintLinting, styl, pravidla pro typově orientované textyAnoZdarmaCelotýmové konvence, bezpečnost asynchronních typů
BiomLinting + formátováníAnoZdarmaESLint + Hezčí náhrada, rychlost
OxcLintLinting (kompatibilní s ESLint)AnoZdarmaMonorepozitáře vyžadující rychlé zpracování textu
Kompilátor TypeScriptu (tsc)Kontrola typůAnoZdarmaChyby typu, vynucování striktního režimu
SemgrepSAST, vlastní vzoryAnoZdarma + placenéBezpečnostní skenování, vlastní organizační pravidla
Snykův kódSAST, zabezpečení závislostíAnoZdarma + placenéTýmy zaměřené na bezpečnost, integrace IDE
SonarQube / SonarCloudKvalitní brány, sledování trendůAnoZdarma + placenéŘídicí panely kvality podniku
SonarLintZpětná vazba kvality na úrovni IDEPouze IDEZdarmaVložené bezpečnostní a kvalitativní tipy
Dependency-CruiserVynucení grafu závislostíAnoZdarmaOvěření architektonických pravidel
DeptracVynucení hranic vrstevAnoZdarmaČistá architektura, hranice DDD
NxSpráva závislostí MonorepoAnoZdarma + placenéHranice modulů Monorepo
StřihMrtvý kód a nepoužívané exportyAnoZdarmaSnižování nepoužívaného kódu ve velkém měřítku
ts-morfAnalýza programatických TS ASTSelektivníZdarmaVlastní 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 audit pro 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í