[TypeScript] Основные типы данных
Tags: typescript, webdev, beginners
Published: 2020-05-17 16:20:43

TypeScript:
* расширяет JavaScript, добавляя типы к языку.
* ускоряет процесс разработки, выявляя ошибки и предоставляя исправления еще до того, как вы запустите свой код.
* open source

Типы предоставляют способ описания формы объекта, предоставляют лучшую документацию и позволяют TypeScript'у проверять правильность работы вашего кода.

TypeScript код транспилируется в JS через компилятор TS или Babel. Итоговый JS код чист, прост и может быть запущен в любой среде, поддерживающий JavaScript: браузеры, node и в ваших приложениях.

# Типы данных 

Чтобы программы были полезными, нам нужно иметь возможность работать с некоторыми простейшими единицами данных: числами, строками, структурами, логическими значениями и т.п. В TypeScript мы поддерживаем почти те же типы, которые вы ожидаете в JavaScript.

## Boolean

```typescript
let isDone: boolean = false;
```

## Number
Как и в JavaScript, все числа в TypeScript являются значениями с плавающей запятой. Числа с плавающей точкой получают тип `number`. В дополнение к шестнадцатеричным и десятичным литералам, TypeScript также поддерживает двоичные и восьмеричные литералы, представленные в ECMAScript 2015.

```typescript
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
```

## String

Еще одна фундаментальная часть создания программ на JavaScript для веб-страниц и серверов - работа с текстовыми данными. Как и в других языках, мы используем тип `string` для ссылки на эти текстовые типы данных. Как и JavaScript, TypeScript также использует двойные кавычки (") или одинарные кавычки (') для окружения строковых данных.

```typescript
let color: string = "blue";
color = 'red';
```

Вы также можете использовать `template strings`, которые могут объединять несколько строк и иметь встроенные выражения. Строки окружены символом backtick / backquote `` (`) ``, а встроенные выражения имеют вид `$ {expr}`.

```typescript
let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${fullName}.
```

## Array

TypeScript, как и JavaScript, позволяет работать с массивами значений. Типы массивов могут быть записаны одним из двух способов. В первом случае вы используете тип элементов, за которым следует [], чтобы обозначить массив этого типа элемента:

```typescript
let list: number[] = [1, 2, 3];
```

Второй способ использует универсальный тип массива ``Array <elemType>``:

```typescript
let list: Array<number> = [1, 2, 3];
```

## Tuple

Типы `tuple` позволяют вам выражать массив с фиксированным числом элементов, типы которых известны, но не обязательно должны быть одинаковыми. Например, вы можете представить значение в виде пары `string` и `number`:

```typescript
// Декларируем тип tuple
let x: [string, number];
//  Правильно инициализируем
x = ["hello", 10]; // OK
// Неправильно инициализируем
x = [10, "hello"]; // Ошибка
```

## Enum

Полезным дополнением к стандартному набору типов данных из JavaScript является `enum`. Как и в таких языках, как C#, enum - это способ придания более понятных имен наборам числовых значений.

```typescript
enum Color {
  Red,
  Green,
  Blue,
}
let c: Color = Color.Green;
```

По умолчанию enum нумеруют свои элементы, начиная с 0. Вы можете изменить это, вручную установив значение одного из его элементов. Например, мы можем начать предыдущий пример с 1 вместо 0:

```typescript
enum Color {
  Red = 1,
  Green,
  Blue,
}
let c: Color = Color.Green;
```

Или даже вручную установите все значения в enum:

```typescript
enum Color {
  Red = 1,
  Green,
  Blue,
}
let c: Color = Color.Green;
```

Удобной особенностью enum является то, что вы также можете перейти от числового значения к названию этого значения в enum. Например, если бы у нас было значение 2, но мы не были уверены в том, что ему совпадает в enum Color, мы могли бы найти соответствующее название через:

```typescript
enum Color {
  Red = 1,
  Green,
  Blue,
}
let colorName: string = Color[2];

console.log(colorName); // Выводит 'Green'
```

## Any

Возможно, нам потребуется описать тип переменных, которые мы не знаем, когда пишем приложение. Такие  значения могут исходить из динамического контента, например, от пользователя или сторонней библиотеки. В этих случаях мы хотим отказаться от проверки типов  во время компиляции. Для этого мы помечаем их типом `any`:

```typescript
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;
```

## Void

`void` является почти противоположностью `any`: отсутствие наличия какого-либо типа вообще. Обычно вы можете увидеть это как возвращаемый тип функций, которые не возвращают значение:

```typescript
function warnUser(): void {
  console.log("This is my warning message");
}
```

Объявление переменных типа `void` бесполезно, поскольку вы можете присваивать им только null или undefined:

```typescript
let unusable: void = undefined;
unusable = null;
```

## Null и Undefined

В TypeScript как `undefined`, так и `null` фактически имеют свои собственные типы с именами undefined и null соответственно. Как и `void`, они не очень полезны сами по себе:

```typescript
let u: undefined = undefined;
let n: null = null;
```

## Never

Тип `never` представляет тип значений, которые никогда не встречаются. Например, `never` является возвращаемым типом для выражения функции или стрелочной функции, которая всегда выдает исключение, или которое никогда не возвращается. 

```typescript
function error(message: string): never {
  throw new Error(message);
}

function fail() {
  return error("Something failed");
}

function infiniteLoop(): never {
  while (true) {}
}
```

## Object

`object` это непримитивный тип, т.е. Всё что не number, string, boolean, symbol, null, или undefined. 

Typescript определяет другой тип, с почти таким же названием, как и новый тип `object`, и это тип `Object`. В то время как `object` (с маленькой буквы) представляет все непримитивные типы, `Object` (с большой буквы) описывает функциональность, общую для всех JavaScript объектов (как бы прототип от базового типа Object). Например, методы toString() и hasOwnProperty(). 

Есть ещё один тип, который очень похож: `{}`, пустой тип объекта. Он описывает объект у которого нет собственных свойств. При попытке доступа к произвольным свойствам такого объекта TypeScript выдаёт ошибку во время компиляции:

```typescript
// Type {}
const obj = {};

// Error: Property 'prop' does not exist on type '{}'.
obj.prop = "value";
```

Тем не менее, вы можете использовать все свойства и методы, описанные в типе Object, которые неявно доступны через цепочку прототипов: