История вопроса:
JavaScript позволяет применять методы bind, call и apply для передачи контекста (this) и аргументов. До появления TypeScript 3.2 эти методы воспринимались менее строго: в их аргументах часто допускались лишние или некорректные значения, что порождало ошибки на этапе выполнения. TypeScript реализовал параметр strictBindCallApply, который добавляет строгую проверку сигнатур этих методов.
Проблема:
Без строгой типизации методы bind/call/apply позволяли "проскочить" лишним, отсутствующим или несовпадающим по типу аргументам без каких-либо ошибок на этапе компиляции.
Решение:
С включением strictBindCallApply компилятор TypeScript строго требует, чтобы:
Пример кода:
function sum(a: number, b: number): number { return a + b; } const sum2 = sum.bind(null, 1); sum2(2); // OK sum2(2, 3); // Ошибка в strictBindCallApply
Ключевые особенности:
Работает ли strictBindCallApply только для функций, или влияет также на методы класса?
Влияет и на функции, и на методы, потому что методы bind/call/apply доступны у любой функции (Function.prototype). Это касается как независимых функций, так и методов классов.
Может ли параметр strictBindCallApply быть включён без строгого режима strict?
Нет, для его активации нужен strict=true либо прямое указание strictBindCallApply=true в tsconfig.json.
Что произойдёт, если передать через bind больше параметров, чем определено в исходной функции?
Компилятор TypeScript с включённым strictBindCallApply выдаст ошибку: "Expected X arguments, but got Y". Это защищает от распространённой ошибки пролонгированной подписи или случайного захвата лишних переменных.
** Негативный кейс Разработчик использует .bind для частичного применения аргументов, но ошибся в их количестве. В обычном режиме ошибок нет, но на продакшене функция вызывается с лишним параметром и ломается логика.
Плюсы:
Минусы:
** Позитивный кейс Включён strictBindCallApply, функции и методы используют bind строго по сигнатуре: лишние или неверные аргументы отсеиваются на этапе компиляции.
Плюсы:
Минусы: