Насколько надежен вывод типа? - PullRequest
1 голос
/ 06 апреля 2020

Я только начинаю поднимать typescript и наткнулся на type inference.

Теперь, по словам инструктора, не рекомендуется инициализировать переменную с помощью type, а полагаться на type inference, но сразу же я сделал эту ошибку, как показано ниже

function add(n1: number, n2: number, showResult: boolean, phrase: string) {
  const result = n1 + n2;
  if (showResult) {
    console.log(phrase + result);
  }
  return result;
}

let number1;
number1 = '5';
const number2 = 2.8;

add(number1, number2, printResult, resultPhrase);

Из кода Приведенный выше фрагмент явно позволил string проскользнуть при проверке типа, и поэтому вместо этого будет лучше, если мы не будем полагаться на type inference, а вместо этого явно установим тип? Например, ниже

let number1: number;
number1 = '5';

, и мы сразу же получаем ошибку из приведенного выше кода. Ниже изображение является доказательством не доверять type inference.

enter image description here

1 Ответ

3 голосов
/ 06 апреля 2020

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 и вызовет проблемы.

Использование Тип аннотации, когда переменная изначально не имеет ничего назначено, прекрасно.

...