во первых, у вас код неправильный, должно быть видимо let foo: ( x: number ) => void
потому что проверка типов это не просто сравнивание сигнатур функций - это проверка что один тип может быть приведен к другому.
функция у которой нет параметра может быть вызвана в месте где ей передадут параметр, она просто его проигнорирует. То есть тип функции без параметров приводится к типу с параметрами.
По факту, если вы вызовите foo(123) то она отработает нормально, что система типов и учитывает.
попробуйте сделать наоборот и сразу получите ошибку: let foo: () => void = (x: number) => null
То же самое если параметры будут не совпадать по типам
Если у функции нет параметров, само собой что он будет проигнорирован. Другое дело, когда он должен быть, а он не передан. Почему нет ошибки?
И, почему вы решили что проверяется приведение типов? Мы можем любое значение привести к булевому, но это не значит что оно будет принято в TS (будет ошибка). Выходит, что вы неправы. Откуда ваша информация?
Судя по всему, понял в чем дело. Я не обнаружил приведения типов, но проверку TS всё же производит, даже если в сигнатуре присвоенной функции нет аргументов. Он проверяет не по фактической сигнатуре функции, а по сигнатуре функции, указанной в типе переменной. Таким образом проверяются лишь точки вызовов функции, и сигнатура функции на предмет соответствия ожидаемому типу. Даже подсказки при вводе показываются из типа, а не из самой функции.
Он проверяет не по фактической сигнатуре функции, а по сигнатуре функции, указанной в типе переменной. Таким образом проверяются лишь точки вызовов функции, и сигнатура функции на предмет соответствия ожидаемому типу.
Неверно.
type Foo = () => void;
const foo: Foo = (x: string) => {};
// TS2322: Type '(x: string) => void' is not assignable to type 'Foo'.
type Bar = (x: number) => string;
const bar: Bar = () => 1;
// TS2322: Type 'number' is not assignable to type 'string'.
RomanYakimchuk, почитайте систему типов в тайпскрипте повнимательнее. Может быть я плохо объясняю но базовый принцип там крайне простой - тип приводится - все норм, не приводится ошибка.
Другое дело, когда он должен быть, а он не передан. Почему нет ошибки?
С чего вы взяли что нет? Если он должен быть но не передан - будет ошибка.