JavaScript — это язык программирования, вызывающий смешанные чувства у разработчиков программного обеспечения. Динамическая типизация — это и благословение, и проклятие. Для людей, начинающих свой путь разработки программного обеспечения, JavaScript может быть благоприятным выбором из-за его относительной простоты изучения по сравнению с низкоуровневыми языками и языками со статической типизацией.

По моему твердому убеждению, настоятельно рекомендуется приобрести знания о TypeScript после того, как вы получили свою первоначальную работу. Использование TypeScript расширяет возможности вашего разработчика и сводит к минимуму ошибки во время выполнения, что делает выгодным начать с его преимуществ.

Начнем?

Система типов TypeScript помогает только во время разработки, прежде чем код будет скомпилирован. Ключевое отличие заключается в том, что JavaScript использует динамические типы, которые разрешаются во время выполнения, а TypeScript использует статические типы, которые устанавливаются во время разработки.

Чтобы использовать TypeScript, нам нужно установить его глобально.

npm i -g typescript

Основные типы

число: все числа, без различия между целыми числами и числами с плавающей запятой.
строка:все текстовые значения.
логическое значение: true или ложный. (без истинных или ложных значений)
объект:любой объект JavaScript.
массив:любой массив JavaScript, он может быть гибким или строгим в отношении элемента types.
tuple:массив фиксированной длины и типа (добавленный TypeScript).
enum: автоматически перечисляемые глобальные константные идентификаторы.
любое:любое значение, без присвоения определенного типа.

(Все основные примитивные типы в TypeScript написаны строчными буквами.)

Если мы создаем переменную с неназначенным путем, нам нужно выделить ее типом.

const rank = 1; //assigned
//typescript will automatically infer the type of variable rank

let status: string; //unassigned
status = 'active';
/* here we need to write a type because typescript doesn't know what
is the type of status before assigning a value to it. */

Объекты

let info: {
  name: string;
  age: number;
  status?: string; //? means it is optinal. status is optional inside info.
}'

info = {
  name: 'xyz',
  age: 27
};

Тип объекта также может быть создан для вложенных объектов.

let product: {
  id: number;
  price: number;
  details: {
    title: string;
    description: string;
  }
}

product = { ... };

Массивы

let list: string[];
list = ['product1', 'product2'];

let ranks: number[];
ranks = [1, 2, 3];

let mixture: any[];
mixture = ['product1', 'product2', 1, 2, 3];

Кортеж

let student: [string, number];
student = ['John Doe', 1];

student = ['Joh Doe', '1']; //this will throw error

student.push('3'); //typescript can't detect error

Кортеж имеет исключение проверки длины, если мы используем метод push.

перечисления

enum Person { MALE, FEMALE};
//identifiers automatically get value of 0 and 1 respectively

const studentOne = Person.MALE;
const studentTwo = Person.FEMALE;
//studentOne will be 0 and studentTwo will be 1

enum Person {MALE = 1, FEMALE};
/* we can also set manual value to first identifier and next identifiers
will get incremented values */

Союз

let input: string | number;

input = 'John Doe';
input = 1;

С объединением мы можем определить более одного типа для переменной. В зависимости от логики нам может понадобиться проверка типов во время выполнения.

Буквальный

let inputType: 'as-number' | 'as-text';

inputType = 'number'; //this will throw error
inputType = 'as-number';

Мы можем установить конкретное значение в качестве типа, и нам не нужно запоминать это значение, потому что typescript выдаст ошибку, если мы используем другое значение.

Псевдонимы типов

type Person = {
  name: string;
  age: number;
  address?: string;
  gender: 'male' | 'female';
};

let person: Person;

person = {
  name: 'John Doe',
  age: 25,
  gender: 'male'
};

Мы можем хранить сложные типы в псевдониме типа, чтобы мы могли повторно использовать его снова.

Неизвестный

let name: unknown;
let firstName: string;

name = 1;
firstName = 'John Doe';

firstName = name;
//(with any this can work. but with unknown it won't work.)

//we need to add extra runtime type checking.
if(typeof name === 'string') {
    firstName = name;
};

Неизвестный похож на любой, любой — очень гибкий тип, но неизвестный накладывает ограничения, потому что с неизвестным нам нужно добавить дополнительную проверку типа во время выполнения. Мы не должны использовать unknown всегда, но мы можем использовать его, если хотим быть более строгими, когда мы не знаем тип заранее, но знаем, что мы хотим с ним делать в конечном итоге.

Адиос

Вот и все. Это все, что вам нужно, чтобы начать работать с TypeScript, но о TypeScript есть еще много чего, что вам нужно изучить, чтобы воспользоваться преимуществами TypeScript и стать лучшим разработчиком.