JavaScript е език за програмиране, който предизвиква смесени емоции от разработчиците на софтуер. Динамичното писане е едновременно благословия и проклятие. За хора, които започват своето пътуване в разработката на софтуер, JavaScript може да бъде благоприятен избор поради относителната му лекота на научаване в сравнение с езиците от по-ниско ниво и статично въведените езици.

По мое твърдо убеждение е силно препоръчително да придобиете познания по TypeScript, след като сте си осигурили първоначалната работа. Възприемането на TypeScript подобрява изживяването ви за разработчици и минимизира грешките по време на изпълнение, което го прави изгодно да започнете с неговите предимства.

Ще започнем ли?

Типовата система на TypeScript помага само по време на разработката, преди кодът да бъде компилиран. Ключовата разлика е, че JavaScript използва динамични типове, които се разрешават по време на изпълнение, а TypeScript използва статични типове, които се задават по време на разработката.

За да използваме TypeScript, трябва да го инсталираме глобално.

npm i -g typescript

Типове ядра

число: всички числа, без разграничение между цели числа и числа с плаваща заглавие.
низ:всички текстови стойности.
булеви: вярно или невярно. (без верни или фалшиви стойности)
обект:всеки JavaScript обект.
масив:всеки JavaScript масив, той може да бъде гъвкав или строг по отношение на елемента типове.
кортеж:масив с фиксирана дължина и тип (добавен от TypeScript).
enum:автоматично изброени глобални постоянни идентификатори.
any:всякакъв вид стойност, без конкретно присвояване на тип.

(Всички основни примитивни типове в 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

Tuple има изключение за проверка на дължината, ако използваме 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;

С union можем да дефинираме повече от един тип за променлива. В зависимост от логиката може да се нуждаем от проверка на типа по време на изпълнение.

Буквално

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 е подобен на any, any е много гъвкав тип, но unknown е ограничителен, защото с unknown трябва да добавим допълнителна проверка на типа по време на изпълнение. Не трябва да използваме неизвестен винаги, но можем да го използваме, ако искаме да сме по-ограничителни, когато не знаем типа предварително, но знаем какво искаме да правим с него в крайна сметка.

Адиос

Това е, хора. Това е всичко, от което се нуждаете, за да започнете да работите с TypeScript, но има много повече за TypeScript, които трябва да научите, за да се възползвате от TypeScript и да станете по-добър разработчик.