メインコンテンツまでスキップ

strictBindCallApply

strictBindCallApplybindcallapplyの型チェックを厳しくするコンパイラオプションです。

  • デフォルト: strictが有効の場合はtrue、それ以外はfalse
  • 追加されたバージョン: 3.2
  • TypeScript公式が有効化推奨

bindcallapplyが型チェックされない

strictBindCallApplyfalse(TypeScriptのデフォルト)の場合、ビルトイン関数bindcallapplyの引数の型をチェックしません。

ts
// 引数が文字列型の関数
function fn(x: string) {}
 
// 渡す引数は数値型だが、警告は出ない
fn.call(undefined, 122);
ts
// 引数が文字列型の関数
function fn(x: string) {}
 
// 渡す引数は数値型だが、警告は出ない
fn.call(undefined, 122);

bindcallapplyで呼び出す関数の戻り値型注釈は無視され、戻り値の型はanyになります。

ts
function fn(): string {
return "str";
}
const x = fn.call(undefined);
const x: any
ts
function fn(): string {
return "str";
}
const x = fn.call(undefined);
const x: any

strictBindCallApplyfalseの場合、実行時エラーが発生する恐れがあります。

ts
function fn(x: string) {
x.toUpperCase();
}
const x = fn.call(undefined, 123);
TypeError: x.toUpperCase is not a function
ts
function fn(x: string) {
x.toUpperCase();
}
const x = fn.call(undefined, 123);
TypeError: x.toUpperCase is not a function

bindcallapplyの型チェックを行う

strictBindCallApplytrueにすると、bindcallapplyの型チェックが行われます。

ts
function fn(x: string) {}
fn.call(undefined, 123);
Argument of type 'number' is not assignable to parameter of type 'string'.2345Argument of type 'number' is not assignable to parameter of type 'string'.
ts
function fn(x: string) {}
fn.call(undefined, 123);
Argument of type 'number' is not assignable to parameter of type 'string'.2345Argument of type 'number' is not assignable to parameter of type 'string'.

加えて、戻り値の型は呼び出す関数の戻り値型になります。

ts
function fn(): string {
return "str";
}
const x = fn.call(undefined);
const x: string
ts
function fn(): string {
return "str";
}
const x = fn.call(undefined);
const x: string

戻り値に型がつくため、補完が効くメリットもあります。

ts
function fn(): string {
return "str";
}
const str = fn.call(undefined);
str.toU;
       
ts
function fn(): string {
return "str";
}
const str = fn.call(undefined);
str.toU;
       

strictBindCallApplyは有効にするのがお勧めです。

学びをシェアする

TypeScriptのstrictBindCallApplyはbind、call、applyの型チェックを厳しくするコンパイラオプション

【falseの場合】
❌引数の型チェックがされない
⚠️戻り値はanyになる

【trueの場合】
✅引数の型チェックがされる
💚戻り値に型がつく
👍有効化推奨

『サバイバルTypeScript』より

この内容をツイートする

関連情報

📄️ strict

strict系のオプションを一括で有効化する
  • 質問する ─ 読んでも分からなかったこと、TypeScriptで分からないこと、お気軽にGitHubまで🙂
  • 問題を報告する ─ 文章やサンプルコードなどの誤植はお知らせください。