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

アサーション関数 (assertion functions)

ユーザー定義の型ガード関数として使われるのはType predicateが主ですが、Assertion functionという方法もあります。
Type predicateはboolean型の戻り値に対して使いましたがこちらは関数が例外を投げるかどうかで判定します。型ガード関数のページで作った関数isDuck()をAssertion functionsで書きかえると次のようになります。

ts
function isDuck(animal: Animal): asserts animal is Duck {
if (walksLikeDuck(animal)) {
if (quacksLikeDuck(animal)) {
return;
}
}
 
throw new Error("YOU ARE A FROG!!!");
}
 
// ここではquacks()は存在しない
animal.quacks();
Property 'quacks' does not exist on type 'Animal'.2339Property 'quacks' does not exist on type 'Animal'.
 
isDuck(animal);
 
animal.quacks();
ts
function isDuck(animal: Animal): asserts animal is Duck {
if (walksLikeDuck(animal)) {
if (quacksLikeDuck(animal)) {
return;
}
}
 
throw new Error("YOU ARE A FROG!!!");
}
 
// ここではquacks()は存在しない
animal.quacks();
Property 'quacks' does not exist on type 'Animal'.2339Property 'quacks' does not exist on type 'Animal'.
 
isDuck(animal);
 
animal.quacks();

こちらはこの関数が呼ばれた後であればいつでも変数animalDuck型として解釈されます。