Типы букв Typescript и операторы сложения - PullRequest
3 голосов
/ 13 апреля 2020

Для typescript литеральных типов поведение отличается, независимо от того, используем ли мы обычные операторы сложения (например, a = a + b) или операторы сложения присваивания (например, a += b):

type SomeLiteralType = 1;

let a: SomeLiteralType = 1;

// Why is it possible to change the value of Literal type to unsupported value without any error?
a += 1;

// Now it's even not allowed to assign to itself - next error occurs: "Type 'number' is not assignable to type '1'"
a = a;

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

То же самое происходит и со строками.

Это ожидаемое поведение, и я что-то пропустил в документация?

1 Ответ

0 голосов
/ 14 апреля 2020

1) c += b; и a += a; по отношению к процессу проверки типа равны.
Объяснение того, что происходит, можно найти в 4).

2) d = d + b;
Это выражение будет интерпретировано компилятором следующим образом:
Выражение назначения:
левая сторона: d
токен (оператор): =
правая сторона: d + b
Чтобы проверить типы с обеих сторон, компилятор выводит тип для правого и левого выражения.
В случае левой стороны все просто.
Для правой стороны это будет число. Причина в том, что все математические операторы (+, -, ...) возможны только с числами (в j JavaScript), и поэтому результат должен быть также с номером типа.
С вычитанным введите Odd слева и число справа, вы получите ошибку.

3) e = a + a;
По той же причине, что и строка выше (2))

4) a += a; Это выражение сводится к следующему:
Выражение назначения: слева сторона: a
токен (оператор): +=
правая сторона: a
Поскольку мы знаем из вышеизложенного, все математические операторы могут применяться только к числам,
это должно быть само за себя. Компилятор проверяет, является ли левая сторона числом,
, которым является a, и является ли правая сторона числом. a или 1 - это числа, так что это работает.

Почему последняя строка работ теперь должна быть понятна, и я оставлю это как домашнее задание для вас;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...