From 008282dd380b8ebb644cae203efb4628ab848c6f Mon Sep 17 00:00:00 2001 From: Illia Piskurov Date: Fri, 18 Oct 2024 14:29:46 +0300 Subject: [PATCH] Added ukranian translation --- uk-ua/typescript-ua.html.markdown | 274 ++++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 uk-ua/typescript-ua.html.markdown diff --git a/uk-ua/typescript-ua.html.markdown b/uk-ua/typescript-ua.html.markdown new file mode 100644 index 00000000..7e4663b5 --- /dev/null +++ b/uk-ua/typescript-ua.html.markdown @@ -0,0 +1,274 @@ +--- +language: TypeScript +lang: uk-ua +contributors: + - ["Philippe Vlérick", "https://github.com/pvlerick"] + - ["Kiwimoe", "https://github.com/kiwimoe"] +translators: + - ["Illia Piskurov", "https://github.com/illia-piskurov"] +filename: learntypescript-ua.ts +--- + +TypeScript - це мова, яка має на меті полегшити розробку великомасштабних додатків, написаних на JavaScript. +TypeScript додає загальні концепції, такі як класи, модулі, інтерфейси, узагальнене програмування та +(необов'язково) статичну типізацію до JavaScript. Вона є надмножиною JavaScript: увесь код JavaScript є дійсним +кодом TypeScript, тому його можна легко додати до будь-якого проекту. Компілятор TypeScript генерує JavaScript. + +Ця стаття концентрується тільки на синтаксисі TypeScript, на відміну від статті про [JavaScript](../javascript-ua/). + +Для тестування компілятора TypeScript перейдіть по посиланню в [пісочницю](https://www.typescriptlang.org/Playground). +Там ви маєте змогу написати код (з підтримкою автодоповнення) та одразу побачити згенерованний JavaScript код. + +```ts +// TypeScript має 3 базові типи +var isDone: boolean = false; +var lines: number = 42; +var name: string = "Андерс"; + +// Тип «any» для випадків, коли заздалегідь невідомий тип змінної +var notSure: any = 4; +notSure = "або, можливо, рядок"; +notSure = false; // або логічний тип + +// Для колекцій є типізовані та узагальнені масиви +var list: number[] = [1, 2, 3]; +// Альтернатива з використанням узагальненого масиву +var list: Array = [1, 2, 3]; + +// Перелік: +enum Color {Red, Green, Blue}; +var c: Color = Color.Green; + +// Зрештою, «void» використовується для позначення того, що функція нічого не повертає +function bigHorribleAlert(): void { + alert("Я маленьке надокучливе віконечко!"); +} + +// Функції — це об'єкти першого класу. Вони підтримують лямбда-синтаксис (=>) +// і використовують виведення типів (type inference) + +// Наступні рядки коду є еквівалентними, компілятором передбачається +// однакова сигнатура, на виході генерується однаковий JavaScript-код +var f1 = function(i: number): number { return i * i; } +// Передбачається тип, що повертається +var f2 = function(i: number) { return i * i; } +var f3 = (i: number): number => { return i * i; } +// Передбачається тип, що повертається +var f4 = (i: number) => { return i * i; } +// Передбачається тип, що повертається, в однорядковій функції ключове слово «return» не потрібне +var f5 = (i: number) => i * i; + +// Інтерфейси є структурними; усе, що має властивості, сумісне з інтерфейсом +interface Person { + name: string; + // Опціональні властивості, позначені символом «?» + age?: number; + // І, звісно, функції + move(): void; +} + +// Об'єкт, який реалізує інтерфейс «Person» +// До нього можна звертатися, як до «Person», оскільки він має властивості «name» і «move» +var p: Person = { name: "Боббі", move: () => {} }; +// Об'єкти, які можуть мати опціональні властивості: +var validPerson: Person = { name: "Боббі", age: 42, move: () => {} }; +// Це не «Person», оскільки «age» не є числовим значенням +var invalidPerson: Person = { name: "Боббі", age: true }; + +// Інтерфейси можуть також описувати функціональний тип +interface SearchFunc { + (source: string, subString: string): boolean; +} +// Важливі лише типи параметрів, імена — ні. +var mySearch: SearchFunc; +mySearch = function(src: string, sub: string) { + return src.search(sub) != -1; +} + +// Класи. Члени класу за замовчуванням є публічними +class Point { + // Властивості + x: number; + + // Конструктор — ключові слова public/private у цьому контексті згенерують + // шаблонний код для властивості та для ініціалізації в конструкторі + // У цьому прикладі «y» буде визначено так само, як і «x», але з меншим обсягом коду + // Значення за замовчуванням також підтримуються + + constructor(x: number, public y: number = 0) { + this.x = x; + } + + // Функції + dist() { return Math.sqrt(this.x * this.x + this.y * this.y); } + + // Статичні члени + static origin = new Point(0, 0); +} + +var p1 = new Point(10 ,20); +var p2 = new Point(25); // y буде дорівнювати 0 + +// Наслідування +class Point3D extends Point { + constructor(x: number, y: number, public z: number = 0) { + super(x, y); // Явний виклик конструктора базового класу обов'язковий + } + + // Перевизначення + dist() { + var d = super.dist(); + return Math.sqrt(d * d + this.z * this.z); + } +} + +// Модулі, знак «.» може використовуватися як роздільник для позначення підмодулів +module Geometry { + export class Square { + constructor(public sideLength: number = 0) { + } + area() { + return Math.pow(this.sideLength, 2); + } + } +} + +var s1 = new Geometry.Square(5); + +// Локальний псевдонім для посилання на модуль +import G = Geometry; + +var s2 = new G.Square(10); + +// Узагальнене програмування +// Класи +class Tuple { + constructor(public item1: T1, public item2: T2) { + } +} + +// Інтерфейси +interface Pair { + item1: T; + item2: T; +} + +// І функції +var pairToTuple = function(p: Pair) { + return new Tuple(p.item1, p.item2); +}; + +var tuple = pairToTuple({ item1:"Привіт", item2:"Світ"}); + +// Включення посилання на файл визначення: +/// + +// Шаблонні рядки (Template Strings) (рядки, які використовують зворотні лапки) +// Інтерполяція рядків за допомогою шаблонних рядків +let name = 'Тайрон'; +let greeting = `Привіт ${name}, як ся маєш?` +// Багаторядкові рядки за допомогою шаблонних рядків +let multiline = `Це приклад +багаторядкового рядку`; + +// READONLY: Нова функція у TypeScript 3.1 +// Члени, які доступні лише для читання +interface Person { + readonly name: string; + readonly age: number; +} + +var p1: Person = { name: "Тайрон", age: 42 }; +p1.age = 25; // Помилка, p1.age є тільки для читання + +var p2 = { name: "Джон", age: 60 }; +var p3: Person = p2; // Ок, тільки для читання через псевдонім p2 +p3.age = 35; // Помилка, p3.age є тільки для читання +p2.age = 45; // Ок, але також змінює p3.age через псевдонім + +class Car { + readonly make: string; + readonly model: string; + readonly year = 2018; + + constructor() { + this.make = "Unknown Make"; // Присвоєння дозволено у конструкторі + this.model = "Unknown Model"; // Присвоєння дозволено у конструкторі + } +} + +let numbers: Array = [0, 1, 2, 3, 4]; +let moreNumbers: ReadonlyArray = numbers; +moreNumbers[5] = 5; // Помилка, елементи тільки для читання +moreNumbers.push(5); // Помилка, метод push відсутній (оскільки він змінює масив) +moreNumbers.length = 3; // Помилка, довжина тільки для читання +numbers = moreNumbers; // Помилка, відсутні методи для зміни масиву + +// Tagged Union Types для моделювання стану, що може мати одну з кількох форм +type State = + | { type: "завантаження" } + | { type: "успіх", value: number } + | { type: "помилка", message: string }; + +declare const state: State; +if (state.type === "успіх") { + console.log(state.value); +} else if (state.type === "помилка") { + console.error(state.message); +} + +// Template Literal Types +// Використовуються для створення складних типів рядків +type OrderSize = "Звичайне" | "Велике"; +type OrderItem = "Еспресо" | "Капучино"; +type Order = `${OrderSize} ${OrderItem}`; + +let order1: Order = "Звичайне Капучино"; +let order2: Order = "Велике Еспресо"; +let order3: Order = "Маленьке Капучино"; // Помилка + +// Ітератори та Генератори + +// Оператор for..of +// Ітерація по списку значень об'єкта, що перебирається +let arrayOfAnyType = [1, "рядок", false]; +for (const val of arrayOfAnyType) { + console.log(val); // 1, "рядок", false +} + +let list = [4, 5, 6]; +for (const i of list) { + console.log(i); // 4, 5, 6 +} + +// Оператор for..in +// Ітерація по списку ключів об'єкта, що перебирається +for (const i in list) { + console.log(i); // 0, 1, 2 +} + +// Type Assertion (Приведення типів) + +let foo = {} // Створення порожнього об'єкта foo +foo.bar = 123 // Помилка: властивість 'bar' не існує на `{}` +foo.baz = 'привіт світ' // Помилка: властивість 'baz' не існує на `{}` + +// Оскільки передбачуваний тип foo є `{}` (об'єкт з 0 властивостями), +// не дозволяється додавати bar і baz до нього. Однак за допомогою приведення типу, +// наступне пройде без помилок: + +interface Foo { + bar: number; + baz: string; +} + +let foo = {} as Foo; // Приведення типу +foo.bar = 123; +foo.baz = 'привіт світ' +``` + +## Для подальшого читання + +* [Офіційний веб-сайт TypeScript](https://www.typescriptlang.org/) +* [Вихідний код на GitHub](https://github.com/microsoft/TypeScript) +* [Вивчення TypeScript](https://learntypescript.dev/)