jsconfig.json option

strictBindCallApply

  • Default false
  • Since TypeScript 3.2

fn.call(thisArg, ...args), fn.apply(thisArg, args) and fn.bind(thisArg, ...args) call a function indirectly. Without strictBindCallApply, TypeScript accepts any arguments there; with it, they are checked against the function's parameters, exactly as a direct call would be.

It is part of strict and arrived with TypeScript 3.2.

At a glance

Write Leave it to strict; write "strictBindCallApply": false only to turn this one check back off
On the command line --strictBindCallApply
Type boolean
Default in TypeScript 5.9 false (on when strict is on)
Default from TypeScript 6.0 true, through strict (TypeScript 6.0)
TypeScript's description Check that the arguments for 'bind', 'call', and 'apply' methods match the original function.

The description is quoted from TypeScript's own option list (Apache-2.0); see the notices.

Examples

main.js Error confirmed 5.9.3 TypeScript 5.9.3, run 21 October 2026: main.js(8,35): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. 6.0.3 TypeScript 6.0.3, run 21 October 2026: the same as 5.9.3. main.js(8,35): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. 7.0.2 TypeScript 7.0.2, run 21 October 2026: the same as 5.9.3. main.js(8,35): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. checked 21 October 2026
/** @param {string} name */
function greet(name) {
  return `Hello, ${name.trim()}`;
}

console.log(greet.call(undefined, "Ada"));
console.log(greet.call(undefined, 42));error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
strictBindCallApply on: call checks the argument.
jsconfig.json for this example
{
  "compilerOptions": {
    "checkJs": true,
    "noEmit": true,
    "strict": true,
    "target": "es2022",
    "module": "nodenext",
    "types": []
  },
  "include": [
    "*.js"
  ]
}
main.js TypeScript 5.9.3 TypeScript 5.9.3, run 21 October 2026: No errors. 6.0.3 TypeScript 6.0.3, run 21 October 2026: the same as 5.9.3. No errors. 7.0.2 TypeScript 7.0.2, run 21 October 2026: the same as 5.9.3. No errors. checked 21 October 2026
/** @param {string} name */
function greet(name) {
  return `Hello, ${name.trim()}`;
}

console.log(greet.call(undefined, "Ada"));
console.log(greet.call(undefined, 42));
strictBindCallApply off: call accepts anything.
jsconfig.json for this example
{
  "compilerOptions": {
    "checkJs": true,
    "noEmit": true,
    "strict": true,
    "target": "es2022",
    "module": "nodenext",
    "types": [],
    "strictBindCallApply": false
  },
  "include": [
    "*.js"
  ]
}

Where it shows up in JavaScript

Older JavaScript leans on these methods: borrowing array methods with Array.prototype.slice.call(arguments), binding event handlers with this.onClick.bind(this), and apply to spread an array of arguments. With the option on, each of those calls is checked, and bind returns a function with the remaining parameters typed.

Gotchas

  • The first argument, thisArg, is checked against a @this type when the function has one; see @this.

Sources

Last reviewed 20 October 2026.