number1
набирается как any
, поскольку при объявлении ему ничего не назначается. А any
, к сожалению, можно назначить на что угодно - поэтому использовать его настоятельно не рекомендуется. С
function add(n1: number,
, если вы вызовете add
, где первый переданный аргумент имеет тип any
, он скомпилируется.
Назначение другого значения переменной после объявленная переменная не меняет тип - Typescript по-прежнему видит, что она напечатана как any
.
Чтобы не допустить подобных ошибок, обязательно включите noImplicitAny
в вашем tsconfig - он выдаст ошибки, когда вы попытаетесь использовать any
, где ожидается более конкретный тип c.
Еще что-то, что помогает, это использовать const
вместо let
- при const
тип всегда будет определен автоматически. Иногда вам может понадобиться аннотировать более конкретный тип c, чем выведенный, но, по крайней мере, выведенный тип всегда будет иметь спецификацию c, а не any
. (const
должно быть предпочтительнее, чем let
всякий раз, когда это возможно)
Если вам делать необходимо использовать let
- что иногда необходимо - затем либо присвоить ему значение при инициализации (и вывод типа будет работать), или используйте аннотацию типа, такую как
let number1: number;
, чтобы печатать правильно, в противном случае это будет any
и вызовет проблемы.
Использование Тип аннотации, когда переменная изначально не имеет ничего назначено, прекрасно.