Почему в следующем коде мне разрешено назначать функцию с сигнатурой, отличной от указанной в типе переменной? Как мне изменить тип Func, чтобы не допускать таких назначений?
type Func = (a: string, ...rest: any[]) => Promise<any>;
let f: Func = () => Promise.resolve() // why no error although string argument is missing?






В основном происходит то, что Typescript не заставляет вас вводить аргументы функции, которые вам не нужны. В вашем случае тело вашего метода не использует ни один из переданных аргументов, даже если вы их напечатаете. Так что можете их пропустить.
Однако не допускается следующее:
type Func = (a: string, ...rest: any[]) => Promise<any>;
let f: Func = (a: boolean) => Promise.resolve()
Потому что прямо сейчас сигнатуры функций точно не совпадают.
Однако вы можете передать часть аргументов. Допускаются следующие ИС:
type Func = (a: string, ...rest: any[]) => Promise<any>;
let f: Func = (a: string) => Promise.resolve()
Несмотря на то, что мы пропускаем аргумент ...rest, сигнатура функции по-прежнему принимается Typescript.
Подумайте об этом так: если ваша сигнатура функции не имеет определенных аргументов, вы также не можете выполнять какие-либо вычисления с аргументами, переданными функции. Поэтому невозможно передать аргументы неправильного типа. Так что, что касается Typescript, все по-прежнему безопасно для типов :)