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.
Таким образом, выведение типа полезно при проверке типов, когда нет доступной явной аннотации типов.