Це дуже поширене запитання в контексті розмови про TypeScript. Якщо ви почули його на інтервʼю, це може бути хорошим сигналом того, що TS в проєкті використовується не просто для галочки.
Type Narrowing(звуження) означає конкретизацію типу для TypeScript. Наприклад, в нас є змінна з типом string | number i narrowing в цьому випадку буде означати перевірку змінної на те чи її значення має string чи number. В залежності від реального значення, ми будемо мати різну імплементацію, для різних типів даних.
Існує декілька способів звузити тип. В контексті цього запитання ми розберемо тільки базові, які зазвичай запитують на інтервʼю:
typeof
Це найпростіший спосіб, який використовується для примітивів. Якщо TypeScript зустрічається з Union типом, він не дозволяє викликати методи чи доступатись до полів, які присутні тільки в одному з типів. В такому випадку, вам потрібно явно перевірити, що значення є конкретним типом. Або використати as, але це вважається Bad Practice в TypeScript 👹
instanceof
Це звуження типу, через перевірку чи є об’єкт екземпляром певного класу. Він використовується не так часто, як наприклад typeof, але для розуміння Type Narrowing потрібно розібрати і його. Типовий приклад використання, це керування помилками:
Зазвичай, розуміння typeof i instanceof цілком достатньо в контексті інтервʼю. Але якщо ви хочете копнути трохи глибше, ось інші способи Type Narrowing:
- Discriminated unions
- Operator in
- Type guards
- Assertion functions