TypeScript: Выведение типа

Источник: «Type Inference in TypeScript»
TypeScript — типизированный язык. Однако необязательно указывать тип переменной. TypeScript выводит типы переменных, когда нет доступной явной информации в виде аннотации типов.

Типы определяются компилятором TypeScript, когда:

Например,

var a = "some text"

Здесь, поскольку мы явно не определяем a: string с аннотацией типа, TypeScript определяет тип переменной на основе значения присвоенного переменной. Значение a является строкой, и, следовательно, тип выводится как string.

Рассмотрим следующий пример:

var a = "some text";
var b = 123;
a = b; // Compiler Error: Type 'number' is not assignable to type 'string'

Приведённый выше код показывает ошибку, потому что при выведении типов TypeScript выводит тип переменной a как string и переменную b как number. Когда мы пытаемся присвоить b переменную a, компилятор жалуется, что тип number не может быть присвоен типу string.

Выведение типа в сложных объектах

Могут быть сценарии, в которых объект может быть инициализирован несколькими типами.

Например:

var arr = [ 10, null, 30, 40 ];

В приведённом выше примере у нас есть массив со значениями 10, null, 30, и, 40. TypeScript ищет наиболее распространённый тип, чтобы сделать вывод о типе объекта. В этом случае он выбирает тот, который совместим со всеми типами, т.е. number, а также null.

Рассмотрим другой пример:

var arr = [0, 1, "test"];

В этом случае массив имеет значения типа number, а так же тип string. В таких случая компилятор TypeScript ищет наиболее распространённый тип, чтобы сделать вывод о типе объекта, но не находит никакого супер типа, который мог бы охватывать все типы, присутствующие в массиве. В таких случаях компилятор обрабатывает тип как объединение всех типов, присутствующих в массиве. Здесь будет тип (string|number) — это означает, что массив может содержать либо строковые значения, либо числовые значения. Это называется Объединения (union type)

Попробуем добавить новый элемент в массив:

var arr = [0, 1, "test"];
arr.push("str")

Компилятор принимает новое значение, поскольку у него тип string, что нормально.

Теперь давайте попробуем добавить в массив новый тип, который ещё не был частью массива:

var arr = [0, 1, "test"];
arr.push("str") // OK
arr.push(true); // Compiler Error: Argument of type 'true' is not assignable to parameter of type 'string | number'

Приведённый выше код покажет ошибку компилятора, потому что boolean не является часть объединение (string | number).

Тип возвращаемого значения функции так же определяется возвращаемым значением. Например:

function sum(a: number, b: number )
{
return a + b;
}
var total: number = sum(10,20); // OK
var str: string = sum(10,20); // Compiler Error

В приведённом выше код тип возвращаемого значения функции sum()number. Таким образом, результат может быть сохранён в переменной типа number, а не в переменной типа string.

Таким образом, выведение типа полезно при проверке типов, когда нет доступной явной аннотации типов.

Дополнительные материалы

Предыдущая Статья

TypeScript: Утверждение Типа

Следующая Статья

Laravel: Рефакторинг контроллера