Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
type_script [2024/05/02 17:23] tro |
type_script [2024/05/04 11:18] (текущий) tro |
||
|---|---|---|---|
| Строка 37: | Строка 37: | ||
| </ | </ | ||
| + | ===== Рефакторінг проекту з React на TypeScript + React ===== | ||
| + | [[https:// | ||
| + | |||
| ===== Типизація ===== | ===== Типизація ===== | ||
| ==== Базова ==== | ==== Базова ==== | ||
| Строка 79: | Строка 82: | ||
| </ | </ | ||
| ==== Unknown ==== | ==== Unknown ==== | ||
| - | TypeScript багато в чому схожий на any, але він забезпечує більше безпеки під час роботи зі змінними. Якщо ми спробуємо присвоїти значення змінної типу unknown іншій змінній з конкретним типом без явного приведення типів, TypeScript видасть помилку. Це допомагає запобігти випадковому присвоєнню значень неправильного типу. | + | * TypeScript багато в чому схожий на any, але він забезпечує більше безпеки під час роботи зі змінними. Якщо ми спробуємо присвоїти значення змінної типу unknown іншій змінній з конкретним типом без явного приведення типів, TypeScript видасть помилку. Це допомагає запобігти випадковому присвоєнню значень неправильного типу. |
| + | * Цей тип можна перетворити на інший тип за допомогою операторів as, typeof, instanceof. | ||
| < | < | ||
| function fetchUserData() { | function fetchUserData() { | ||
| Строка 91: | Строка 95: | ||
| </ | </ | ||
| ==== Tuple (кортедж, | ==== Tuple (кортедж, | ||
| + | Попри те, що кортежі фіксують число та типи елементів, | ||
| < | < | ||
| let tupleType: [string, boolean]; | let tupleType: [string, boolean]; | ||
| Строка 118: | Строка 123: | ||
| </ | </ | ||
| + | Існує ще така конструкція, | ||
| + | Значення const enum вставляють у місце використання у вигляді літералів. Це може допомогти покращити продуктивність. | ||
| + | < | ||
| + | const enum HttpCodes { | ||
| + | OK = 200, | ||
| + | BadRequest = 400, | ||
| + | Unauthorized = 401, | ||
| + | } | ||
| + | |||
| + | const status = HttpCodes.OK; | ||
| + | |||
| + | </ | ||
| + | ==== Union Type ==== | ||
| + | Union Type у TypeScript дозволяє вказати, | ||
| + | < | ||
| + | let mixedType: string | number | boolean; | ||
| + | |||
| + | mixedType = ' | ||
| + | mixedType = 10; // OK | ||
| + | mixedType = true; // OK | ||
| + | mixedType = {}; // Error: Type ' | ||
| + | </ | ||
| + | ==== Intersection Type ==== | ||
| + | Intersection type є способом об' | ||
| + | < | ||
| + | type Employee = { | ||
| + | name: string; | ||
| + | id: number; | ||
| + | }; | ||
| + | |||
| + | type Manager = { | ||
| + | employees: Employee[]; | ||
| + | }; | ||
| + | |||
| + | type CEO = Employee & Manager; | ||
| + | |||
| + | const ceo: CEO = { | ||
| + | name: ' | ||
| + | id: 1, | ||
| + | employees: [ | ||
| + | { | ||
| + | name: ' | ||
| + | id: 2, | ||
| + | }, | ||
| + | ], | ||
| + | }; | ||
| + | |||
| + | export {}; | ||
| + | |||
| + | </ | ||
| + | ==== Literal Type ==== | ||
| + | Literal Type — це тип, що набуває конкретного значення. З ним ви можете визначити тип змінної так, щоб він набував лише певних значень. | ||
| + | Тобто може містити лише одне з можливих рядкових значень. | ||
| + | < | ||
| + | type OneOrTwo = 1 | 2; | ||
| + | let value: OneOrTwo; | ||
| + | value = 1; // OK | ||
| + | value = 2; // OK | ||
| + | value = 3; // Error: Type ' | ||
| + | |||
| + | type YesOrNo = ' | ||
| + | let answer: YesOrNo; | ||
| + | answer = ' | ||
| + | answer = ' | ||
| + | answer = ' | ||
| + | |||
| + | export {}; | ||
| + | </ | ||
| + | ==== Return Type ==== | ||
| + | Return type — це тип даних, який функція повертає під час її виклику. TypeScript дозволяє вказувати тип значення, | ||
| + | < | ||
| + | function greet(): string { | ||
| + | return 100; // Error: Type ' | ||
| + | } | ||
| + | |||
| + | let result = greet(); | ||
| + | </ | ||
| + | < | ||
| + | const greet = (): string => { | ||
| + | return " | ||
| + | } | ||
| + | |||
| + | let result = greet(); | ||
| + | |||
| + | </ | ||
| + | TypeScript здатний автоматично визначати типи значень функцій, | ||
| + | < | ||
| + | function greet() { | ||
| + | return ' | ||
| + | } | ||
| + | |||
| + | let result: string = greet(); | ||
| + | |||
| + | export {}; | ||
| + | </ | ||
| + | ==== Void ==== | ||
| + | Тип void у TypeScript використовується для позначення відсутності будь-якого типу взагалі, | ||
| + | < | ||
| + | function logMessage(message: | ||
| + | console.log(message); | ||
| + | } | ||
| + | |||
| + | logMessage(' | ||
| + | |||
| + | export {}; | ||
| + | </ | ||
| + | ==== Never ==== | ||
| + | Це коли функція ніколи не закінчується та нічого не повертає. Часто тип never використовується для функцій, | ||
| + | < | ||
| + | // Функція, | ||
| + | function throwError(message: | ||
| + | throw new Error(message); | ||
| + | } | ||
| + | |||
| + | // Функція з нескінченним циклом | ||
| + | function infiniteLoop(): | ||
| + | while (true) {} | ||
| + | } | ||
| + | |||
| + | export {}; | ||
| + | </ | ||
| + | ==== Function Type ==== | ||
| + | < | ||
| + | let myFunc: (firstArg: string, secondArg: number) => void; | ||
| + | |||
| + | myFunc = (first: string, second: number) => { | ||
| + | console.log(`First: | ||
| + | }; | ||
| + | |||
| + | myFunc(' | ||
| + | |||
| + | export {}; | ||
| + | </ | ||
| + | ===== Інтерфейси ===== | ||
| + | нтерфейс — це визначення кастомного типу даних, але без будь-якої реалізації. | ||
| + | |||
| + | |||
| + | |||
| + | У TypeScript інтерфейси відіграють ключову роль статичної типізації. Вони допомагають забезпечити узгодженість та чіткість структури об' | ||
| + | |||
| + | |||
| + | |||
| + | Давайте розглянемо приклад інтерфейсу для опису типу даних Person: | ||
| + | < | ||
| + | interface Person { | ||
| + | firstName: string; | ||
| + | lastName: string; | ||
| + | age?: number; // Необов' | ||
| + | } | ||
| + | |||
| + | function greet(person: | ||
| + | console.log(`Hello, | ||
| + | } | ||
| + | |||
| + | const john: Person = { | ||
| + | firstName: ' | ||
| + | lastName: ' | ||
| + | }; | ||
| + | |||
| + | greet(john); | ||
| + | |||
| + | </ | ||
| + | ===== Використання сторонніх бібліотек ===== | ||
| + | Іноді ви можете зіткнутися з бібліотекою, | ||
| + | ==== DefinitelyTyped ==== | ||
| + | це репозиторій на GitHub, у якому спільнота TypeScript підтримує визначення типів для тисяч JavaScript-бібліотек. | ||
| + | Наприклад, | ||
| + | < | ||
| + | npm install --save-dev @types/ | ||
| + | </ | ||
| + | ==== Хуки, які зазвичай не потрібно типізувати ==== | ||
| + | ==== useEffect ==== | ||
| + | useEffect очікує, | ||
| + | < | ||
| + | useEffect(() => { | ||
| + | let isActive = true; | ||
| + | |||
| + | return (): void => { | ||
| + | isActive = false; | ||
| + | }; | ||
| + | }, []); | ||
| + | </ | ||
| + | ==== useMemo ==== | ||
| + | У цьому прикладі ми використовуємо хук useMemo для оптимізації продуктивності. Ми створюємо мемоізоване значення selectedUser, | ||
| + | < | ||
| + | import React, { useMemo } from ' | ||
| + | |||
| + | type User = { | ||
| + | id: number; | ||
| + | name: string; | ||
| + | }; | ||
| + | |||
| + | type Props = { | ||
| + | users: User[]; | ||
| + | selectedUserId: | ||
| + | }; | ||
| + | |||
| + | export function UserList({ users, selectedUserId }: Props) { | ||
| + | const selectedUser = useMemo(() => { | ||
| + | return users.find(user => user.id === selectedUserId); | ||
| + | }, [users, selectedUserId]); | ||
| + | |||
| + | return ( | ||
| + | < | ||
| + | {selectedUser && < | ||
| + | {users.map(user => ( | ||
| + | < | ||
| + | ))} | ||
| + | </ | ||
| + | ); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||