Ошибка при сравнении константной строки Typescript

Это фактически препятствует запуску моего приложения Angular. Это производный пример, const я устанавливаю только для проверки некоторых значений в функции, поэтому есть способы обойти это, но это кажется таким странным, что я хотел бы знать, что происходит.

Следующий код дает ошибку tslint Type '"Red"' is not comparable to type '"Green"'. Также происходит с операторами if.

const color = 'Red'

switch(color) {
  case 'Red':
    //do something
  case 'Green':
    //something else
}

Почему он использует строки в качестве типов? Почему я не могу сравнить константную строковую переменную со строкой? Это похоже на ошибку.


person redOctober13    schedule 25.06.2018    source источник
comment
Возможный дубликат Оператор Typescript Switch выдает ошибку "не сравним с типом"   -  person mij    schedule 25.06.2018


Ответы (1)


Typescript имеет литеральные типы, тип, представляющий одно значение. Константные типы будут выводиться из литерального типа, представляющего присваиваемое им значение. Поэтому, когда вы объявляете const color = 'Red', тип color на самом деле будет типом строкового литерала 'Red', а не типом string.

Typescript делает это для того, чтобы проверить как можно больше вашего кода. В этом случае, если подумать, случай Green не может быть достигнут из этого кода, поэтому, вероятно, в этом коде есть что-то недействительное (мы обычно не хотим писать мертвый код).

Если вы хотите, чтобы тип константы был просто string, вы можете ввести константу вручную:

const color: string = 'Red'; 
person Titian Cernicova-Dragomir    schedule 25.06.2018
comment
получение этой ошибки - [tslint] Строка типа тривиально выводится из строкового литерала, удалите аннотацию типа (без выводных типов) - person j1s; 01.04.2019
comment
@ j1s Что я могу сказать .. tslint ошибается .. конечно, это будет выведено, но это будет выведено из чего-то другого, чего вы не хотите ... Я всегда воспринимаю предупреждения tslint с долей скептицизма, они могут быть ошибками но не всегда, я бы сказал, что это тот, который вы можете подавить, если вы действительно хотите, чтобы const был строкой, а не строковым литералом. - person Titian Cernicova-Dragomir; 01.04.2019