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