Типы данных

Последнее обновление: 15.05.2021

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

Тип Boolean представляет логическое значение true или false:

let isEnabled: boolean = true;
let isAlive: boolean = false;

console.log(isEnabled);
console.log(isAlive);

number

Тип 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

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!`;

bigint

Для представления очень больших чисел в 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

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"

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850