Типы TypeScript описывают, какое значение может хранить переменная. Тип пишут после двоеточия, let name: string, и компилятор отвергает любой код, который кладёт туда значение не того вида. Базовые типы это семь примитивов JavaScript плюс объектные типы для массивов и объектов.
Аннотации проверяются во время компиляции и затем удаляются. Запускается обычный JavaScript.
Примитивные типы
| Тип | Примеры значений | Примечания |
|---|---|---|
string | "hi", 'hi', `hi ${name}` | Текст. У всех трёх видов кавычек один и тот же тип. |
number | 42, 3.14, -0.5, NaN, Infinity | Любое число, целое или нет. Типов int и float нет. |
boolean | true, false | Только эти два значения. |
bigint | 10n, BigInt(10) | Целые числа любого размера. Нужен target ES2020 или новее. |
symbol | Symbol("id") | Уникальное значение, чаще всего используется как ключ объекта. |
null | null | «Намеренно пусто». |
undefined | undefined | «Не задано». Так же читается отсутствующее свойство. |
Имена типов пишутся строчными буквами. typeof во время выполнения возвращает те же слова для большинства из них, поэтому typeof x === "number" и есть способ проверить примитивный тип значения, пока программа работает.
Аннотации типов
Аннотация это : Type после переменной, параметра или списка параметров функции. Важнее всего аннотации у параметров: TypeScript не может угадать, что передаст вызывающий код.
Если переменная инициализируется в той же строке, аннотация обычно лишняя: у let count = 10 уже тип number. Правила, когда тип можно не писать, описаны на странице вывод типов.
Неверный тип это ошибка компиляции
Присвойте значение не того типа, и компилятор остановится до того, как что-либо запустится:
Компилятор выводит:
index.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'.
Исправление: преобразовать значение, port = Number("3000"), или поменять аннотацию, если переменная действительно должна хранить текст.
number: целочисленного типа нет
JavaScript хранит любое число как 64-битное значение с плавающей точкой, поэтому в TypeScript есть единственный тип number. Целые числа точны до Number.MAX_SAFE_INTEGER (2 ** 53 - 1). Дальше используйте bigint.
bigint и number не смешиваются: exact + 1 это ошибка компиляции (TS2365: Operator '+' cannot be applied to types 'bigint' and '1'., где '1' это литеральный тип значения 1), а если бы код всё же запустился, то ещё и TypeError во время выполнения. Явно преобразуйте одну из сторон через BigInt(1) или Number(exact), помня, что Number округляет значения за пределами безопасного диапазона.
Тип, который принимает только целые числа, TypeScript для произвольных значений выразить не может. Проверяйте через Number.isInteger там, где значение попадает в программу.
boolean
У boolean ровно два значения, true и false. Значения, которые просто truthy (1, "yes"), булевыми не являются, поэтому превращайте их в булево через Boolean(x) или x !== 0.
null и undefined
При включённом strict (по умолчанию начиная с TypeScript 6.0) null и undefined это отдельные типы, они не входят ни в string, ни в number, ни в какой другой тип. Переменная, которая может быть пустой, говорит об этом через объединение:
Чтение свойства значения, которое может быть undefined, остаётся ошибкой компиляции, пока вы его не проверите. Проверки, ?. и ?? описаны на странице null и undefined.
Массивы и объекты вкратце
Всё, что не примитив, относится к объектным типам. Три формы, которые встречаются первыми:
let tags: string[] = ["ts", "js"]; // array of strings
let point: { x: number; y: number } = { x: 1, y: 2 }; // object with two number properties
let greet: (name: string) => string = (n) => `hi ${n}`; // function type
У каждой есть своя страница: массивы, кортежи (массивы фиксированной длины), объектные типы и типы функций.
string, number, boolean против String, Number, Boolean
Имена с заглавной буквы это типы объектов-обёрток JavaScript (new String("x")), а не обычных значений. В аннотациях пишите имена строчными буквами.
index.ts(3,7): error TS2322: Type 'String' is not assignable to type 'string'.
'string' is a primitive, but 'String' is a wrapper object. Prefer using 'string' when possible.
Замените String на string в первой строке, и блок запустится. То же относится к Number, Boolean, Symbol и BigInt. (Object особый случай: он принимает почти любое значение, включая примитивы; см. объектные типы.)
Другие встроенные типы
Ещё несколько типов встречаются рано. У каждого своя страница.
| Тип | Значение |
|---|---|
any | Отключает проверку для этого значения. Избегайте его. |
unknown | Любое значение, но перед использованием его нужно проверить. |
void | Функция не возвращает ничего полезного. |
never | Никакого значения: функция, которая всегда бросает исключение, или невозможный случай. |
object | Любое непримитивное значение. |
"red" | "green" | Литеральный тип: только эти точные значения. |
Часто задаваемые вопросы
Есть ли в TypeScript целочисленный тип?
Нет. number покрывает и целые, и дробные числа, потому что JavaScript хранит любое число как 64-битное число с плавающей точкой. Проверить, что число целое, можно во время выполнения через Number.isInteger(n), а для целых больше Number.MAX_SAFE_INTEGER (2 ** 53 - 1) без потери точности используйте bigint (10n).
Чем string отличается от String в TypeScript?
string это примитивный тип, его имеют строковые литералы и шаблонные строки. String это тип объекта-обёртки, который создаёт new String("x"). Всегда пишите в аннотациях string, number и boolean со строчной буквы; присвоение String переменной типа string даёт ошибку компиляции (TS2322).
Какие примитивные типы есть в TypeScript?
Те же семь, что и в JavaScript: string, number, boolean, bigint, symbol, null и undefined. Всё остальное (массивы, объекты, функции, экземпляры классов) относится к объектным типам.
Как объявить переменную с типом в TypeScript?
Поставьте двоеточие и тип после имени: let count: number = 0;. У функции аннотируйте каждый параметр и, при желании, возвращаемый тип: function add(a: number, b: number): number. Если переменная инициализируется сразу, аннотацию обычно можно опустить: TypeScript выведет тип сам.
Существуют ли типы TypeScript во время выполнения?
Нет. Компилятор проверяет типы, а затем удаляет их, поэтому в исполняемом JavaScript аннотаций нет. Во время выполнения значения проверяют операторами JavaScript, такими как typeof, Array.isArray и instanceof.