Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!09.09.2023
Typescript обмежує
На мою думку, найстрашніша помилка при переході з JavaScript на TypeScript - це очікувати, що доведеться тільки додати до свого коду типи, а структуру кода та підходи можна не змінювати. Так і зʼявляються десятиповерхові типи, неможливі для розуміння.
-
Підхід з гнучкими аргументами, дуже популярний в JavaScript. Наприклад, коли функція може приймати опції та колбек, або тільки опції, або тільки колбек, або колбек як одну з опцій… Така функція утворює складні для розуміння типи з багатьма альтернативами — а значить, поганий досвід використання. Згадаємо, що такий підхід зʼявився саме як спроба покращити життя споживачам, які можуть помилитись з порядком аргументів — проблема, яку вже вирішує TypeScript. Тому краще зупинитись на одній манері виклику функції- тоді у споживачів буде чітке розуміння.
-
Обʼєкти з нечітко визначеним набором полів. Теж типове явище в JavaScript. Поля наповнюються в різні моменти життєвого циклу обʼєкта. Зазвичай ми здогадуємось про наявність того чи іншого поля за контекстом. Наївний підхід в TS - це перевіряти кожне поле на наявність — або не перевіряти зовсім, а присипати код оператором
!
. Це нівелює всі переваги від використання TypeScript. Краще робити вузькі типи для кожної конкретної ситуації. Це також допоможе формалізувати логіку та описати перебіг даних. -
Функції, які доповнюють обʼєкти додатковими атрибутами. Як широко відомий приклад — функція connect в Redux. Доповнення обʼєктів призводить до жахливих типів; бо, наприклад. доведеться обмежувати, що вхідний обʼєкт не мав атрибутів, що додаються. Краще не доповнювати обʼєкти, а повертати нові. Або принаймні якщо доповнювати, то фіксованим набором атрибутів.
Так само як складні тести сигналять про поганий факторинг коду, складні типи сигналять про нечіткий життєвий цикл даних. Такі та інші “нечіткі” ситуації треба перекладати на код з простішими типами. А також не писати нового коду на TypeScript зі своїми нечіткими підходами з JavaScript.