Type Inference
TypeScript може визначити (а потім перевірити) тип змінної на основі кількох простих правил. Тому що ці правила прості, ви можете навчити свій мозок розпізнавати безпечний/небезпечний код (це сталося зі мною та моїми товаришами по команді досить швидко).
Потік типів – це саме те, як я уявляю в своєму мозку потік інформації про типи.
Variable Definition
Типи змінної виводяться за визначенням.
Це приклад типів, що перетікають справа наліво.
Function Return Types
Тип повернення визначається операторами return, наприклад. передбачається, що наступна функція повертає number
.
Це приклад типів, що випливають знизу.
Assignment
Тип параметрів функції/повернених значень також можна визначити за допомогою призначення, наприклад. тут ми говоримо, що foo
є Adder
, що робить number
типом a
і b
.
Цей факт можна продемонструвати наведеним нижче кодом, який викликає помилку, як ви сподіваєтесь:
Це приклад типів, що перетікають зліва направо.
Той самий спосіб визначення типу призначення працює, якщо ви створюєте функцію для аргументу зворотного виклику. Зрештою, argument -> parameter
- це просто інша форма призначення змінних.
Structuring
Ці прості правила також працюють за наявності structuring (створення буквального об’єкта). Наприклад, у наступному випадку тип foo
вважається {a:number, b:number}
Аналогічно для масивів:
І звичайно будь-яке вкладення:
Destructuring
І, звичайно, вони також працюють з деструктуризацією обох об’єктів:
and arrays:
І якщо параметр функції можна вивести, то можна вивести і його деструктуровані властивості. Наприклад, тут ми деструктуруємо аргумент на члени a
/b
.
Type Guards
Ми вже бачили, як Type Guards допомагає змінювати та звужувати типи (зокрема, у випадку об’єднань). Захисники типу — це просто інша форма виведення типу для змінної в блоці.
Warnings
Be careful around parameters
Типи не входять у параметри функції, якщо це не можна вивести з призначення. Наприклад, у наступному випадку компілятор не знає типу foo
, тому він не може визначити тип a
або b
.
Однак, якщо було введено foo
, можна визначити тип параметрів функції (обидва a
, b
вважаються типом number
у прикладі нижче).
Be careful around return
Хоча TypeScript загалом може визначити тип повернення функції, це може бути не те, що ви очікуєте. Наприклад, тут функція foo
має тип повернення any
.
Це тому, що на тип повернення впливає погане визначення типу для addOne
(c
- це any
, тому повернення addOne
є any
, тому повернення foo
є any
).
Я вважаю найпростішим завжди чітко говорити про повернення функції. Зрештою, ці анотації є теоремою, а тіло функції є доказом.
Є й інші випадки, які можна уявити, але хороша новина полягає в тому, що існує прапор компілятора, який може допомогти виявити такі помилки.
noImplicitAny
noImplicitAny
Прапор noImplicitAny
в наказує компілятору викликати помилку, якщо він не може визначити тип змінної (і тому може мати її лише як implicit any
тип). Тоді можна
або скажіть, що yes I want it to be of type
any
додавши explicitly анотацію типу: any
допоможіть компілятору, додавши ще кілька вірних анотацій.
Last updated