TypeScript является строго типизированным языком, и каждая переменная и константа в нем имеет определенный тип. При этом в отличие от javascript мы не можем динамически изменить ранее указанный тип переменной.
В TypeScript имеются следующие базовые типы:
boolean: логическое значение true или false
number: числовое значение
string: строки
Array: массивы
кортежи
Enum: перечисления
Any: произвольный тип
Symbol
null и undefined: соответствуют значениям null и undefined в javascript
Never: также представляет отсутствие значения и используется в качестве возвращаемого типа функций, которые генерируют или возвращают ошибку
Большинство из этих типов соотносятся с примитивными типами из JavaScript.
Для установки типа применяется знак двоеточия, после которого указывается название типа. Примеры создания переменных:
let x: number = 10; let hello: string = "hello world"; let isValid: boolean = true;
То есть в данном случае выражение let hello: string = "hello world"
указывает, что переменная hello
будет иметь тип string
и значение hello world
.
При этом если в коде мы потом захотим изменить тип, например:
let hello: string = "hello world"; hello = 23;
То в процессе компиляции компилятор TypeScript выдаст ошибку.
Вначале рассмотрим примитивные типы данных, которые есть в TypeScript.
Тип Boolean представляет логическое значение true или false:
let isEnabled: boolean = true; let isAlive: boolean = false; console.log(isEnabled); console.log(isAlive);
Тип number представляет числа, причем все числа в TypeScript, как и в JavaScript, являются числами с плавающей точкой. Поэтому с помощью данного типа можно определять как целые числа, так и числа с плавающей точкой:
let age: number = 36; let height: number = 1.68;
TS поддерживает двоичную, восьмеричную, десятичную и шестнадцатиричную записи чисел:
let decimal: number = 6; // шестнадцатиричная система let hex: number = 0xf00d; // 61453 в десятичной // двоичная система let binary: number = 0b1010; // 10 в десятичной // восьмиричная система let octal: number = 0o744; // 484 в десятичной console.log(decimal); console.log(hex); console.log(binary); console.log(octal);
String представляет строки. Как и в JavaScript, в TypeScript строки можно заключать в двойные, либо в одинарные кавычки:
let firstName: string = "Tom"; let lastName = 'Johns';
Кроме того, TypeScript поддерживает такую функциональность, как шаблоны строк, то есть мы можем задать шаблон в
косых кавычках (`), как если бы мы писали обычную строку, и затем в саму строку можно встраивать разные выражения с помощью
синтаксиса ${ expr }
, где expr - это выражение. Например:
let firstName: string = "Tom"; let age: number = 28; let info: string = `Имя ${firstName} Возраст: ${age}`; console.log(info); // Имя Tom Возраст: 28
Косые кавычки также можно применять для установки многострочного текста:
let sentence: string = `Hello World! Goob bye World!`;
Для представления очень больших чисел в TypeScript добавлен специальный тип bigint. Этот тип позволяет хранить числа больше, чем 253 - 1 - больше, чем позволяет тип number.
Есть два способа определения объекта этого типа. Первый способ - с помощью функции BigInt():
const num1: bigint = BigInt(100); console.log(num1);
Второй способ - с помощью добавления символа n после числового значения:
const num2: bigint = 100n; console.log(num2);
Следует отметить, что этот тип - часть стандарта ES2020, поэтому при компиляции следует установить данный стандарт в качестве целевого через
параметр target
. Например, в файле tsconfig.json:
{ "compilerOptions": { "target": "es2020", "outFile": "app.js" } }
Но можно в принципе и не указывать тип переменной. Например:
let hello = "hello world"; hello = 23;
В этом случае TypeScript автоматически выведет тип из присваемого данной переменной значения. Так, на первой строке компилятор TS увидит,
что переменной hello
присваивается строка, поэтому для нее будет использоваться тип string
. Однако на второй строке опять же
компилятор выдаст ошибку, поскольку hello
переменной уже определен тип string. А новое значение предполагает тип number.
Any описывает данные, тип которых может быть неизвестен на момент написания приложения.
let someVar: any = "hello"; console.log(someVar); // сейчас someVar - это string someVar = 20; console.log(someVar); // сейчас someVar - это number
Так как здесь применяется тип any
, то данный код скомпилируется без ошибок, несмотря на смену строкового значения на числовое.
И также мы можем объявлять массивы данного типа:
var someArray: any[] = [ 24, "Tom", false];
Если переменная определяется без значения и указания типа, и только впоследствии при работе программы ей присваивается значение, тогда считается, что она имеет тип any:
let x; // тип any x = 10; x = "hello";
С одной стороны, any
может показаться удобным типом. Однако, с другой стороны, он лишает программу преимуществ языка TypeScript, в частности,
статической типизации. Соответственно может привнести в программу потенциальные ошибки, связанные с типизацией данных, которые компилятор не сможет отследить
на этапе компиляции.
С помощью оператора typeof мы можем проверить тип переменной. Это может быть необходимо, когда мы хотим выполнить некоторые операции с переменной, но нам неизвестен ее точный тип (например, переменная представляет тип any). Данная функциональность еще называется type guards или защита типа:
let sum: any; sum = 1200; sum = "тысяча двести"; let result: number = sum / 12; console.log(result); // NaN - строку нельзя разделить на число
Переменная sum может хранит любое значение, однако деление может работать только с числами. Поэтому перед делением выполним проверку на тип:
let sum: any; sum = 1200; if (typeof sum === "number") { let result: number = sum / 12; console.log(result); } else{ console.log("invalid operation"); }
Оператор typeof
возвращает тип значения. Например, выражение typeof sum
в данном случае возращает "number", так как переменная
sum представляет число.
Оператор typeof
может возвращать следующие значения:
"string"
"number"
"bigint"
"boolean"
"symbol"
"undefined"
"object"
"function"