# Прості та складні типи даних

TypeScript підтримує статичну типізацію. Це означає, що можна вказувати типи даних для змінних, параметрів функцій, властивостей об'єктів і т. д.&#x20;

Далі наведено основні типи даних, доступні в TypeScript:

## Прості типи даних

Прості типи даних, ще називають скалярними й вони зберігають одне значення.

<table><thead><tr><th width="127">Тип</th><th>Значення </th><th>Опис</th></tr></thead><tbody><tr><td>number</td><td>-21, 8.3, 32</td><td>Будь-яке число. Ціле, відʼємне, дробове</td></tr><tr><td>string</td><td>"Just string!"</td><td>Будь-який рядок</td></tr><tr><td>boolean</td><td>true, false</td><td>Тільки true або false</td></tr><tr><td>null</td><td>null</td><td>Тільки null</td></tr><tr><td>undefined</td><td>undefined</td><td>Тільки undefined</td></tr></tbody></table>

### Оголошення змінних і присвоєння значень

Під час оголошення змінної її тип вказують після двокрапки.

```typescript
let myValue: number;
let myString: string;
let myBooleanValue: boolean;
let myEmptyItem: null;
let myParam: undefined; 
```

Після цього змінній можна присвоїти відповідне значення.

```typescript
myValue = 21;
myString = "Just a random string!";
myBooleanValue = true;
myEmptyItem = null;
myParam = undefined;
```

Можна присвоїти початкове значення одразу при ініціалізації.

```typescript
let myValue: number = 21;
let myString: string  = "Just a random string!";
let myBooleanValue: boolean = true;
let myEmptyItem: null = null;
let myParam: undefined = undefined; 
```

Але як у прикладі вище так переважно не роблять. Якщо змінній присвоюють значення і явно передають тип, то  його вказувати не треба.

```typescript
const myValue = 21;
const myString = "Just a random string!";
const myBooleanValue = true;
const myEmptyItem = null;
const myParam = undefined;
```

В такому разі змінній автоматично задається тип за першим присвоєнням і якщо далі присвоїти значення іншого типу, то виникне помилка.

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2Fe1aa6wjTYWwWX1WrYNV0%2Finit%20error.png?alt=media&#x26;token=ef9833e4-1f0f-4d17-a491-baccf78ef9af" alt="" width="172"><figcaption></figcaption></figure>

Параметрам функцій тип даних також вказують після двокрапки.

```typescript
function myFunction (myValue: number, myString: string, myBooleanValue: boolean, myEmptyItem: null) {
  // function code
}
```

Якщо функції передають параметр з явним типом, то його вказувати не треба.

```typescript
function myFunction (myValue = 21, myString = "Just a random string!", myBooleanValue = true, myEmptyItem = null) {
 // function code
 }
```

## Складні типи <a href="#skladni-tipi" id="skladni-tipi"></a>

### Масиви

#### Масиви чисел

Якщо ми оголосимо масив як колекцію чисел і спробуємо записати у нього якусь іншу сутність, то нам її буде підкреслено хвилястою лінією.

```typescript
let myArrayOfNumbers: number[];
myArrayOfNumbers = [123, 3.4, -20, "Hello"];
```

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2F0joB2uJ7URtgSkQVRxax%2FmyArrayOfNumbers.png?alt=media&#x26;token=64747e46-94ee-47a7-8f7a-d31602487191" alt="" width="340"><figcaption></figcaption></figure>

#### Масиви рядків

Якщо ми оголосимо масив як колекцію рядків і спробуємо записати у нього якусь іншу сутність, то нам її буде підкреслено хвилястою лінією.

```typescript
let myArrayOfstrings: string[];
myArrayOfstrings = [123, 3.4, -20, "Hello"];
```

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2Frrp85XmB4COUcgQYwCXR%2FmyArrayOfstrings.png?alt=media&#x26;token=cb2e0535-b03a-4f13-befb-eb555a6989ec" alt="" width="337"><figcaption></figcaption></figure>

#### Масив будь-яких сутностей

Можна використовувати <mark style="background-color:red;">any</mark>, щоб вказати, що змінна в масиві може мати будь-який тип.&#x20;

```typescript
let myArray: any[];
myArray = [123, 3.4, -20, "Hello"];
```

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2FcQXN3kwYNiPlwmAkdASO%2FmyArrayOfAny.png?alt=media&#x26;token=aecdbbbc-ec40-4441-850d-e7b015f365b4" alt="" width="280"><figcaption></figcaption></figure>

#### Масив обʼєктів&#x20;

Якщо ми оголошуємо масив обʼєктів в якому мають зберігатися дані певного типу, то це треба вказати, як показано нижче.

```typescript
let myArrayOfObjects: { item: string; value: number }[];
myArrayOfObjects = [
  { item: "phone", value: 1 },
  { item: 1, value: "phone" },
];
```

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2FhcUFNOE9e8K8cvnn4yqC%2FmyArrayOfObjects.png?alt=media&#x26;token=cd97557a-d970-43ea-81e4-32b49c38c28e" alt="" width="375"><figcaption></figcaption></figure>

### Обʼєкти

Задати тип "обʼєкт" змінній можна такими способами.

```typescript
const myObject: object = {};
```

або&#x20;

```typescript
const myObject: {} = {};
```

Але і такий запис не зовсім коректний. Адже, якщо ми присвоїмо якесь значення полю обʼєкта і спробуємо його витягнути, то буде помилка. Бо в обʼєкту не буде такої властивості, бо ми її не визначили.

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2FoF3HnDktJ4OmYEy2qZWH%2Fobject-mistake.png?alt=media&#x26;token=02b47a33-3fe0-42d2-94d2-4ea584f70545" alt="" width="356"><figcaption></figcaption></figure>

Тому, треба описувати структуру об'єкта.

```typescript
const myObject: { myString: string; myValue: number } = {
  myString: "Alex",
  myValue: 1,
};
```

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2F8ZBvOkWm9OdUnBXYeJPP%2FmyObject.png?alt=media&#x26;token=80a4c684-d511-452a-8e63-999cd1aa3a91" alt="" width="375"><figcaption></figcaption></figure>

&#x20;У прикладі вище, якщо не вказати визначений параметр об'єкта, то виникне помилка.

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2FsTKg6goK7rJI11NfNc1A%2FmyObject_err1.png?alt=media&#x26;token=fb5ed0a2-20c7-4a56-b7d2-846df94d11bf" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2Fns4SaEhmKkGXhPjiBEdB%2FmyObject_err2.png?alt=media&#x26;token=89dcd902-17bd-4b97-90b0-232562fc6d38" alt="" width="563"><figcaption></figcaption></figure>

Або такий варіант помилки, коли намагаємося вписати невизначений параметр:

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2FKQpQt7ppB8UcsTLxZ4Sc%2FmyObject_err3.png?alt=media&#x26;token=8fbff798-1089-4e22-97d0-7b61e54f575f" alt="" width="317"><figcaption></figcaption></figure>

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2Fr1Yc9lPyCdAa0eDj4Nk6%2FmyObject_err4.png?alt=media&#x26;token=718eb498-8667-45d3-83b7-b32a1a93526d" alt=""><figcaption></figcaption></figure>

Якщо ми хочемо вказати, що якийсь параметр не обовʼязковий, а опціональний, то використовують оператор **?**. Тобто ми його можемо як задавати, так і не задавати. Або присвоїти якесь значення пізніше.

```typescript
const myObject: { myString: string; myValue?: number } = {
  myString: "Alex"
};

myObject.myValue = 1;
```

<figure><img src="https://2122416250-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBlMSwb4UoHEW7y3R9FxZ%2Fuploads%2FEEWAF6vQVf6YZ845alm3%2FmyObject_optional_param.png?alt=media&#x26;token=3c3760da-fed2-4895-b2ab-5c425cfe679d" alt="" width="375"><figcaption></figcaption></figure>

Зазвичай на практиці використовують обʼєкти, які містять більше, аніж один-два параметри (властивості).&#x20;

Виходячи з описаного вище складемо якийсь приклад можливого визначення типів у обʼєкті. Нехай це буде опис якоїсь книжки.

```typescript
let myBook: {
  id: number;
  bookName: string;
  bookAuthor: string;
  bookPrice: number;
  cathegory: string[];
  inStock: boolean;
  details: {
    review: string;
    date: Date;
    imgCover?: string;
  };
};

myBook = {
  id: 12345,
  bookName: "Sophie's World",
  bookAuthor: "Jostein Gaarder",
  bookPrice: 4.49,
  cathegory: ["philosophy", "history"],
  inStock: true,
  details: {
    review:
      "The international bestseller about life, the universe and everything.",
    date: new Date(),
  },
};
```

**Покликання:**

[Типи даних в TypeScript](https://www.typescriptlang.org/docs/handbook/basic-types.html)
