давайте посмотрим только на первую строку.
getTodos(): Todo[] {
Она объявляет функцию с именем getTodos
и что она возвращает: Todo[]
. Скобка - это только начало реализации функции. Преимущество объявления возвращаемого типа состоит в том, что компилятор знает, когда функция не возвращает этот тип. Например, если функция вернула только массив целых чисел, компилятор не будет работать, что предотвратит возможную ошибку во время выполнения. Вот где светится машинопись.
Вы можете задаться вопросом, какой тип имеет функция, если она ничего не возвращает. (Нет или пустая инструкция возврата.
doStuff() : void {
// I dont return anything*.
}
Теперь допустим, что у нас есть функция, которая удаляет последний элемент массива и возвращает этот элемент. Мы могли бы объявить его как:
removeLastElementOfArray(array: any[]): any {
return array.pop();
}
Может быть, для нас очевидно, что, учитывая массив чисел в качестве аргумента этой функции, функция будет возвращать число. Однако мы аннотировали возвращаемый тип любым, поэтому компилятор машинописного текста не имеет представления о том, что междутипы в массиве и возвращаемый тип.
Для этого у нас есть обобщения:
removeLastElementOfArray<T>(array: T[]): T {
return array.pop();
}
Теперь компилятор машинописного текста знает, что если мы передадим массив строк, функция вернет строкуТо же самое относится и к любому другому типу. Обобщения являются очень мощными, так что вы должны как можно больше предотвращать использование любого из них.
* Технически в JS функции без операторов возврата возвращают неопределенное, но мы помечаем их с помощью 'void ', потому что именно так определяются эти типы функций в типизированных языках.