Что такое strict mode в TypeScript и зачем его включать?
"strict": true в tsconfig.json и включает несколько правил, предотвращающих распространённые ошибки.Что такое strict mode
Strict mode в TypeScript — это группа флагов компилятора, которые включаются одной настройкой "strict": true в tsconfig.json. Он усиливает статическую проверку типов и помогает писать более безопасный, предсказуемый код.
Что входит в strict mode
При включении strict: true автоматически активируются следующие флаги:
strictNullChecks— запрещает присваиватьnullиundefinedпеременным без явного указанияstrictFunctionTypes— строгая проверка типов параметров функцийstrictBindCallApply— типизация методовbind,call,applystrictPropertyInitialization— требует инициализации свойств класса в конструктореnoImplicitAny— запрещает неявный типanynoImplicitThis— запрещает неявныйthis: anyalwaysStrict— добавляет'use strict'в каждый скомпилированный файл
Пример: strictNullChecks
// Без strict mode — компилируется без ошибок
function getLength(str: string) {
return str.length;
}
getLength(null); // Ошибки нет, но в рантайме всё сломается
// Со strict mode — ошибка на этапе компиляции
function getLength(str: string) {
return str.length;
}
getLength(null); // Ошибка: Argument of type 'null' is not assignable to parameter of type 'string'
Пример: noImplicitAny
// Без strict mode — параметр неявно получает тип any
function process(data) {
return data.value; // TypeScript не проверяет, есть ли .value
}
// Со strict mode — ошибка компиляции
function process(data) { // Ошибка: Parameter 'data' implicitly has an 'any' type
return data.value;
}
// Правильный вариант — явная типизация
function process(data: { value: string }) {
return data.value;
}
Пример: strictPropertyInitialization
// Со strict mode — ошибка, если свойство не инициализировано
class User {
name: string; // Ошибка: Property 'name' has no initializer
constructor() {
// name не задан
}
}
// Правильный вариант
class User {
name: string;
constructor(name: string) {
this.name = name; // Инициализируем в конструкторе
}
}
Зачем включать strict mode
- Ранняя поимка ошибок — большинство runtime-ошибок обнаруживается ещё на этапе компиляции
- Самодокументирующий код — явная типизация делает намерения разработчика понятными
- Безопаснее работа с null/undefined — самая частая причина падений в продакшне
- Стандарт в индустрии — все современные TypeScript-проекты используют strict mode
Как включить
{
"compilerOptions": {
"strict": true
}
}
Либо включать флаги по отдельности, если нужна постепенная миграция старого проекта.
Что хочет услышать интервьюер
Кандидат знает, что strict — это группа флагов, а не один параметр
Может назвать хотя бы 2–3 конкретных флага из состава strict (strictNullChecks, noImplicitAny)
Понимает, зачем нужен strictNullChecks — предотвращение ошибок с null/undefined в рантайме
Знает, где включается strict mode — в tsconfig.json
Осознаёт практическую пользу: ошибки компилятора вместо рантайм-падений
Пример: Включение strict mode в tsconfig.json
// tsconfig.json
{
"compilerOptions": {
"strict": true
// Эквивалентно явному перечислению:
// "strictNullChecks": true,
// "noImplicitAny": true,
// "strictFunctionTypes": true,
// "strictBindCallApply": true,
// "strictPropertyInitialization": true,
// "noImplicitThis": true,
// "alwaysStrict": true
}
}
Пример: strictNullChecks в действии
// Без strict — нет ошибки компиляции, но падение в рантайме
function getUserName(user?: { name: string }) {
return user.name; // Ошибка только в рантайме если user = undefined
}
// Со strict — ошибка сразу при компиляции
function getUserName(user?: { name: string }) {
return user.name; // Ошибка: Object is possibly 'undefined'
}
// Правильный вариант со strict
function getUserName(user?: { name: string }) {
return user?.name ?? 'Аноним'; // Явная обработка undefined
}
Типичные ошибки
Думают, что strict mode — это один флаг с одной функцией, а не набор нескольких правил
Не могут объяснить разницу между поведением с strict и без него на конкретном примере
Путают strict TypeScript с 'use strict' в JavaScript — это разные вещи (хотя alwaysStrict добавляет и его)
Считают, что strict mode необязателен и его можно игнорировать в реальных проектах
Не знают, как постепенно мигрировать на strict в уже существующем проекте через отдельные флаги


