Есть ли способ отключить сравнение любого типа с другим типом?

Typescript имеет довольно классное сообщение об ошибке при проверке разных типов:

let strange_boolean = true;
let strange_string: string = "1";
console.log(strange_boolean == strange_string);
error: TS2367 [ERROR]: This condition will always return 'false' since the types 'boolean' and 'string' have no overlap.
console.log(strange_boolean == strange_string);
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Для но этот код компилируется:

let strange_boolean: any = true;
let strange_string: string = "1";
console.log(strange_boolean == strange_string);

Потому что any можно преобразовать в anything...

Но что, если я хочу каким-то образом отключить даже неявное преобразование из any во что угодно? Есть ли у Typescript какой-либо флаг для этого? Я хочу, чтобы этот код компилировался только в этом случае:

let strange_boolean: any = true;
let strange_string: string = "1";
console.log(String(strange_boolean) == strange_string);

or

let strange_boolean: any = true;
let strange_string: string = "1";
console.log(Boolean(strange_boolean) == Boolean(strange_string));

person Denis Kotov    schedule 22.06.2020    source источник
comment
В последнее время я мало писал на TypeScript, но, может быть, здесь поможет тип unknown?   -  person Joachim Sauer    schedule 22.06.2020
comment
@JoachimSauer Что такое неизвестный тип ... и на самом деле он работает даже для этого странного типа ... Но я хочу отключить рабочий код, как и любую строку == ... Я хочу только явные действия, явные преобразования   -  person Denis Kotov    schedule 22.06.2020
comment
Поскольку == является эталонным сравнением, я не думаю, что есть простой способ добиться того, чего вы хотите, но unknown похож на any за исключением того, что any может быть чем угодно, поэтому вы можете делать с ним все, что угодно, unknown это может быть что угодно. поэтому вам нужно проверить, что это такое, прежде чем что-либо делать с ним.   -  person Joachim Sauer    schedule 22.06.2020
comment
Связано: "неизвестно" и "любой"   -  person VLAZ    schedule 22.06.2020
comment
@JoachimSauer Я просто хочу предотвратить неявные преобразования;) == это сравнение ссылок только в том случае, если это один и тот же объект, но что, если это другой объект? Я хочу во время компиляции предотвратить такое сравнение с ошибкой comile   -  person Denis Kotov    schedule 22.06.2020
comment
Компилятор TS не делает этого за вас, но если вы используете линтер, такой как ESLint, вы можете использовать правило типа no-explicit-any. Это отвечает на ваш вопрос?   -  person jcalz    schedule 23.06.2020
comment
Возможный дубликат Это системная ошибка типа TypeScript?   -  person jcalz    schedule 23.06.2020


Ответы (1)


К сожалению такой возможности на текущий момент нет...(

Я создал задачу https://github.com/microsoft/TypeScript/issues/39209, но его закрыли, потому что команда Typescript не хочет нарушать обратную сопоставимость для any и это очень жаль, потому что если они добавят этот флаг, то код станет более безопасным, чем в ванильном JavaScript

person Denis Kotov    schedule 16.07.2020