Почему можно переопредилить функцию, которая на входе требует иной сигнатуры?

Код:

let foo: ({ x: number }) => void

foo = () => null
foo = function () {}


По идее, сигнатура функции не соблюдена (аргумент "x" не требуется в присваиваемой функции), но ошибки нет.
Почему этот код валидный?
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 1
Robur
@Robur
Знаю больше чем это необходимо
во первых, у вас код неправильный, должно быть видимо let foo: ( x: number ) => void
потому что проверка типов это не просто сравнивание сигнатур функций - это проверка что один тип может быть приведен к другому.
функция у которой нет параметра может быть вызвана в месте где ей передадут параметр, она просто его проигнорирует. То есть тип функции без параметров приводится к типу с параметрами.
По факту, если вы вызовите foo(123) то она отработает нормально, что система типов и учитывает.

попробуйте сделать наоборот и сразу получите ошибку:
let foo: () => void = (x: number) => null
То же самое если параметры будут не совпадать по типам
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы