Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
type_script [2024/05/02 17:50] tro [Return Type] |
type_script [2024/05/04 11:18] (текущий) tro |
||
|---|---|---|---|
| Строка 37: | Строка 37: | ||
| </ | </ | ||
| + | ===== Рефакторінг проекту з React на TypeScript + React ===== | ||
| + | [[https:// | ||
| + | |||
| ===== Типизація ===== | ===== Типизація ===== | ||
| ==== Базова ==== | ==== Базова ==== | ||
| Строка 172: | Строка 175: | ||
| ==== Literal Type ==== | ==== Literal Type ==== | ||
| Literal Type — це тип, що набуває конкретного значення. З ним ви можете визначити тип змінної так, щоб він набував лише певних значень. | Literal Type — це тип, що набуває конкретного значення. З ним ви можете визначити тип змінної так, щоб він набував лише певних значень. | ||
| + | Тобто може містити лише одне з можливих рядкових значень. | ||
| < | < | ||
| type OneOrTwo = 1 | 2; | type OneOrTwo = 1 | 2; | ||
| Строка 214: | Строка 218: | ||
| export {}; | 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 => ( | ||
| + | < | ||
| + | ))} | ||
| + | </ | ||
| + | ); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||