Почему 'any' можно присвоить любому типу без явного приведения его вначале? - PullRequest
0 голосов
/ 08 января 2019

Почему следующий фрагмент кода не вызывает никаких ошибок или предупреждений?

{
    let x: number;
    let y: any;

    y = "hello";
    x = y;
}

Мои ожидания: что-либо должно быть присвоено y, поскольку оно явно набрано как any, но только числа должны быть присвоены x, поскольку это явно напечатано как number, а если any нужно присвоить x, тогда это должно быть явно приведено к number:

x = y as number; 

Как текущее поведение может считаться приемлемым или хорошей идеей, а не ошибкой? Кроме того, есть ли способ заставить компилятор поднять проблему по этому поводу и принять только явное приведение?


Дополнительная информация:

  • tsc версия: 3.2.2
  • опции компилятора:
{
    "target": "ES5",
    "noImplicitAny": true,
    "strictNullChecks": true,
    "downlevelIteration": true,
    "experimentalDecorators": true,
    "strictBindCallApply": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true
}

1 Ответ

0 голосов
/ 08 января 2019

Это определенное поведение any. Этот тип относится к тому же типу:

  • Назначается из любого другого типа
  • Назначаемый на любой другой тип (проблема, которую вы выделите)
  • С ним разрешена любая операция (индексация, вызов, доступ к свойству, приложение оператора, все разрешено и никак не проверено)

Существует несколько вариантов использования any. Пара примеров:

  • Разрешить легкий переход от js к ts. Во время преобразования кода в машинописный текст any может быть очень полезен для успешной компиляции кода во время преобразования.
  • Разрешить легкое взаимодействие с существующим кодом JS (просто наберите что-нибудь как any, и вы можете использовать его так же, как в JS). Хотя вам, вероятно, лучше писать определения в долгосрочной перспективе.

Учитывая все вышесказанное, я бы сегодня избежал any любой ценой в Typescript В Typescript 3.0 вводится тип unknown, который ведет себя так, как вы ожидаете, что any будет вести себя (то есть вы можете назначить ему что угодно, но его нельзя назначить никакому другому типу). Подробнее о unknown здесь

Несколько вариантов избавления от any:

  • noImplictAny настройка компилятора не позволяет выводить компилятор any, если вы не укажете тип (вместо этого будет выдано сообщение об ошибке)
  • no-unsafe-any Правило tslint, запрещает использование any в динамическом режиме, то есть использование разрешено только в том случае, если оно будет работать для {} | ноль | не определен
  • no-any правило tslint, предотвращает любое и любое использование any
...