Список задач:
- lesson 1 "Встановлення та налаштування";
- lesson 2 "Типи";
- lesson 3 "Налаштування компілятора";
- lesson 4 "Класси";
- lesson 5 "Advanced Types/Generics";
Встановимо глобально typeScript, якщо ви ще цього не зробили.
npm i -g typescript
Створіть папку проекту, наприклад tsCourse.
Створіть файл app.ts
const button = document.querySelector("button");
const input1 = document.getElementById("num1")! as HTMLInputElement;
const input2 = document.getElementById("num2")! as HTMLInputElement;
function add(num1: number, num2: number) {
return num1 + num2;
}
button.addEventListener("click", function() {
console.log(add(+input1.value, +input2.value));
});
Скомпілюйте файл наступною командою
tsc app.ts
У вас з'явиться файл app.js
Тепер давайте додамо файл index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Simple TypeScript page</title>
<script src="app.js" defer></script>
</head>
<body>
<input type="number" id="num1" placeholder="Number 1" />
<input type="number" id="num2" placeholder="Number 2" />
<button>Add!</button>
</body>
</html>
Виконаємо ініціалізацію.
npm init -y
І тепер одразу додамо маленький сервер
npm i --save-dev lite-server
Перейдемо в package.json і додамо в блок scripts нове значення "start": "lite-server", у вас повинно вийти якось так:
{
"name": "TsCourse",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "lite-server"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"lite-server": "^2.6.1"
}
}
Запустимо сервер
npm start
Задайте правильні ts типи для класичних js;
let age = 50;
let name = 'Max';
let toggle = true;
let empty = null;
let notInitialize = undefined;
let callback = (a) => { return 100 + a };
Задайте тип для змінної, в яку можна зберегти будь-яке значення.
let anything = -20;
anything = 'Text';
anything = {};
Виправте код зі змінною unknown, щоб у нього можна було зберегти змінну з текстом.
let some:unknown;
some = 'Text';
let str: string;
str = some;
Зробіть незмінний масив із суворо описаними типами. Масив для прикладу.
let person = ['Max', 21];
Опишіть enum умову наступну: він повинен відображати статус завантаження. Завантажується (LOADING) та завантажена (READY).
Зробіть змінну, яка може приймати або рядок, або число.
Зробіть змінну, яка може приймати лише одне значення з двох: 'enable' або 'disable'
Вкажіть типи для наступних функцій
function showMessage(message) {
console.log(message);
}
function calc(num1, num2) {
return num1 + num2;
}
function customError() {
throw new Error('Error');
}
Створіть свій тип даних на основі наявних даних.
const page1 = {
title: 'The awesome page',
likes: 100,
accounts: ['Max', 'Anton', 'Nikita'],
status: 'open',
details: {
createAt: new Date('2021-01-01'),
updateAt: new Date('2021-05-01'),
}
}
const page2 = {
title: 'Python or Js',
likes: 5,
accounts: ['Alex'],
status: 'close',
}
Запустіть команду
tsc --init
Налаштуйте компілятор, як зазначено в документації.
Увімкніть режим watch
tsc -w
Поекспериментуйте, поміняйте в налаштуваннях "target" з es5 і es6, подивіться, як відрізняється js код.
Налаштуйте Debugging, спробуйте запустити його та поставити breakpoint у різних частинах коду.
Давайте побудуємо будинок:
-
Створіть абстрактний клас House, в ньому повинна бути наступна логіка
- властивість door – вона може бути закрита, або відкрита.
- властивість key – об'єкт класу Key.
- конструктор приймає аргумент класу Key та зберігає його у властивість key.
- метод comeIn, який додає об'єкт класу Person у властивість tenants і це спрацьовує лише, якщо door відкрита.
- абстрактний метод openDoor приймає аргумент класу Key
-
Створіть клас MyHouse, який реалізує клас House
- створюємо метод openDoor, оскільки він приймає ключ, звіряємо збережений ключ у властивості key чи дорівнює він ключу з аргументу, якщо так, відкриваємо двері.
-
Створіть об'єкт Key
- є тільки властивість signature
- під час створення об'єкта генерує випадкове число та зберігає його у signature
- метод getSignature повертає випадкове число з signature
-
Створіть об'єкт Person
- конструктор приймає ключ класу Key і зберігає його у властивість key
- метод getKey повертає key
- Зробіть так, щоб мешканець потрапив додому.
Є функція, яка повертає Promise, він повертає масив рядків і чисел, опишіть правильно тип.
function getPromise () {
return new Promise((resolve) => {
resolve(['Text', 50]);
});
}
getPromise ()
.then((data) => {
console.log(data);
});
У вас є наступний тип даних
type AllType = {
name: string;
position: number;
color: string;
weight: number
}
Є функція, вона приймає два аргументи, в один потрапляє name і color, в іншу частину - position і weight. Потрібно явно вказати, що ці поля з AllType. І сама функція повертає AllType. Скористайтеся Pick.
function compare (top, bottom): AllType {
return {
name: top.name,
color: top.color,
position: bottom.position,
weight: bottom.weight,
}
}
Вкажіть дженерики для функції об'єднання об'єктів.
function merge (objA, objB) {
return Object.assign(objA, objB);
}
У вас є наступні класи
class Component {
constructor (public props:T) {
}
}
class Page extends Component {
pageInfo () {
console.log(this.props.title);
}
}
Тільки додаючи дженерики для класів та інтерфейс, приберіть помилку.