Base Types: primitives, literals, arrays, tuples
Спрашивают на каждом интервью на TS-позицию: чем литеральный тип отличается от примитива, почему const x = ‘a’ даёт literal-тип, а let x = ‘a’ — широкий string. Красные флаги: путать any и unknown, не знать про readonly кортежи и tuple labels.
Примитивы (string, number, boolean, bigint, symbol, null, undefined) и литеральные типы — фундамент. Literal type — это подтип, состоящий из одного значения.
// Widening: let даёт widened type, const — literallet a = 'hi'; // string (widened)const b = 'hi'; // 'hi' (literal)
// Чтобы зафиксировать литерал у let — annotation или as constlet mode: 'on' | 'off' = 'on';const config = { env: 'prod' } as const; // { readonly env: 'prod' }Массивы и кортежи. Кортеж — фиксированная длина и порядок типов; у тапла есть labels и опциональные элементы.
// Массив (любая длина одинакового типа)const xs: number[] = [1, 2, 3];const ys: Array<number> = [1, 2];
// Кортеж: фиксированная длина и порядокconst point: [x: number, y: number] = [10, 20];
// Опциональные и rest-элементы кортежаtype Args = [name: string, age?: number, ...tags: string[]];const a1: Args = ['Ada'];const a2: Args = ['Ada', 36, 'admin', 'core'];
// readonly кортеж — нельзя push/popconst rgb: readonly [number, number, number] = [255, 0, 0];any отключает проверки и заражает соседние выражения; unknown — безопасный аналог: компилятор требует narrowing перед использованием.
function parse(json: string): unknown { return JSON.parse(json);}
const data = parse('{"n":1}');// data.n; // ошибка: Object is of type 'unknown'.if (typeof data === 'object' && data !== null && 'n' in data) { // здесь data сужен до { n: unknown } console.log((data as { n: number }).n);}Итог: Используй const/as const для литералов, кортежи — для фиксированных позиционных данных, unknown вместо any для границ системы.