Гайды
TypeScript: строгая типизация в JS-проектах
strict и noUncheckedIndexedAccess, type vs interface, unknown вместо any, generics, paths и tsc в CI.
~10 мин чтения
TypeScript: строгая типизация в JS-проектах
TypeScript надстраивает статическую типизацию над JavaScript: компиляция в JS, структурная типизация, generics, union/intersection, strict режимы. Подходит для крупных фронтов и Node-бэкендов. Сборка — Webpack и Vite; React — React: компоненты и хуки.
1. tsconfig «строго»
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true
}
}
strict включает noImplicitAny, strictNullChecks и др.
2. Типы vs интерфейсы
interface — расширяемость, слияние деклараций. type — union, mapped types. Для объектов API часто type + zod/io-ts для runtime.
3. unknown вместо any
any отключает проверки. Для внешних данных: unknown + сужение (typeof, custom guard).
4. Generics и утилиты
Pick, Omit, Partial, Record, ReturnType, Parameters — DRY для DTO.
5. Модули и path
paths: @/components/* в tsconfig + настройка bundler/Vite.
6. satisfies и сужение типов
satisfies фиксирует литеральные типы без потери узкости (в отличие от явной аннотации : Type). Сужение через in, discriminated union, asserts-guard функции — предпочтительнее множественных as.
type Route = { path: string; method: "GET" | "POST" };
const routes = [
{ path: "/health", method: "GET" },
{ path: "/orders", method: "POST" },
] as const satisfies readonly Route[];
Здесь as const + satisfies дают и проверку формы, и узкие литеральные типы для дискриминации.
7. Модули и verbatimModuleSyntax
При verbatimModuleSyntax: true явно помечайте import type и export type, чтобы не генерировать лишний runtime-import. Следите за isolatedModules при Babel/swc.
8. Чек-лист
-
noEmitилиemitтолько через сборщик — одна правда. - Типы из OpenAPI — OpenAPI и генерация клиентов.
- CI:
tsc --noEmitна каждый PR. -
skipLibCheckосознанно (ускорение vs строгость в.d.ts). - Единая версия TypeScript в IDE, CI и lockfile.
Дальше: тег TypeScript