Double Equals (==) в TypeScript

Я писал некоторые модульные тесты в TypeScript. Пример теста QUnit содержит:

  ok( 1 == "1", "Passed!" );

Компилятор tsc утверждает, что:

Оператор '==' не может применяться к типам 'number' и 'string'

И выйдет со статусом 1 (хотя он правильно создает JS).

Спектр говорит:

Операторы <, > , < =, > =, ==,! =, === и и == ==

Эти операторы требуют, чтобы один тип операнда был идентичен или подтип другого типа операнда. результат всегда имеет тип булевых примитивов.

Итак, похоже, что предупреждение/ошибка верна. Разве это не приводит к некоторому поражению точки оператора принуждения типа t23? Существует ли когда-либо допустимый прецедент для использования == в TypeScript, который не будет выдавать это предупреждение?

Ответ 1

По крайней мере, один вероятный сценарий для == (т.е. с принудительным типом) в TypeScript - это когда один из ожидаемых операндов имеет любой тип:

Тип S является подтипом типа T, а T является супертипом S, если один из следующего: [...]

T - это любой тип.

Теперь вы, вероятно, видите изображение: любая функция, которая имеет любой параметр, может безопасно (ну, более-менее, все распространенные ошибки == все еще применяются здесь) сравнивают ее со значением любого типа набора с ==.

Ответ 2

Вот несколько распространенных TypeScript примеров, разрешенных компилятором и использующих ==.

var a: string = "A";
var b: Object = "A";

if (a == b) {
    alert("Example 1");
}

var c: any = "1";
var d: number = 1;

if (c == d) {
    alert("Example 2");
}

var e: any = "E";
var f: string = "E";

if (e == f) {
    alert("Example 3");
}

Ответ 3

Одна из точек TypeScript означает, что мы пишем более четкий JavaScript. Сделайте что-то вроде 1 == "1", и это не сработает, если вы явно не применили его или не использовали ToString()/ParseInt() в любом случае в зависимости от того, ожидаете ли вы сравнить строки или числа.

Вы можете использовать Any, чтобы переменные вели себя как обычные динамические переменные JavaScript, но затем вы теряете из виду точку TS, которая должна использовать сильную систему ввода текста/типа, которая помогает нам не падать на многие JavaScript gotchas, которые существуют из-за правил автоматического принуждения типа.