Понимание предупреждений строгого режима

Понимание предупреждений строгого режима

> Учебник по LeekScript

Вы решили перейти на строгий режим, и редактор завалил вас множеством предупреждений, которых раньше не было. Без паники: в этом и смысл строгого режима — быть менее снисходительным и давать меньше свободы, прежде всего в типизации. Рассмотрим несколько типичных предупреждений, чтобы понять, в чём именно проблема, и найти способы её устранить.

Опасное преобразование типа « real » в « integer »

Первый простой случай: я хочу сохранить результат вычисления в переменной целого типа.

Проблема в том, что функция sqrt всегда возвращает значение вещественного типа, даже если математически sqrt(4) равно 2. А вещественное число не помещается без потерь в переменную целого типа: что делать, например, с дробной частью sqrt(2)? Поэтому компилятор требует сделать явный выбор. Есть разные способы устранить это предупреждение:

Опасное преобразование типа « integer? » в « integer »

Другой случай: у меня есть ассоциативный массив (Map) целых чисел, объявленный так, как показано ниже, и я хочу сохранить значение из этого массива в переменной тоже целого типа — казалось бы, типы должны совпадать...

Почему предупреждение говорит, что mapEntier[0] имеет тип «integer?», а не просто «integer»? Напомним, что «?» в конце типа означает, что этот тип принимает также значение null — это эквивалент «integer | null». Так почему мой ассоциативный массив может вернуть null, если, судя по его типу, он содержит только integer? Чтобы прочитать значение из ассоциативного массива, ему нужно передать ключ — здесь «0» в квадратных скобках; этот ключ должен быть типа, заданного для массива, здесь integer, так что на этом уровне всё в порядке. Но ничто не гарантирует редактору, что ключ существует в массиве, а при чтении ассоциативного массива по несуществующему ключу результат всегда будет null. Поэтому результат обращения к ассоциативному массиву по ключу всегда будет nullable. Теперь посмотрим, как решить эту проблему, чтобы избавиться от предупреждений:

Опасное преобразование типа « (Array, Function any>) » в « () »

В этом случае у меня есть список целых чисел, который я хочу отсортировать — на первый взгляд ничего сложного, я даже беру пример из документации

И всё же на этой простой строке я получаю 2 предупреждения. Начнём с первого: оно заключено в круглые скобки, а это значит, что проблема в параметрах функции, которые не соответствуют ожидаемой сигнатуре. Заглянем в документацию arraySort, чтобы увидеть её сигнатуру: Function real | integer> => Array> Это функция, ожидающая 2 параметра: первым — список, вторым — функцию, которая тоже принимает 2 параметра и возвращает целое или вещественное число. Первым параметром мы действительно передаём список, тут всё в порядке; значит, что-то не так со вторым параметром: мы передаём функцию с сигнатурой Function any>, тогда как arraySort ожидает Function real | integer> — тип возвращаемого значения не тот, что ожидается.

Проблема с типизацией функции обратного вызова решена, остаётся второе предупреждение. Как мы только что видели, arraySort возвращает не Array\, как ожидается для нашей переменной, а просто Array — значит, нужно явно привести возвращаемое значение, чтобы исправить проблему.