型保護
- 型保護とは、コンパイル時にスコープ内の変数の型を型情報で保証する表現です。
- 型保護は、キーワードによってブランチの型を決定する機能です。
typeof 型保護
function double(input:string|number|boolean){
if(typeof input === 'string'){
return input + input;
}else {
if(typeof input === 'number'){
return input*2;
}else{
return !input;
}
}
}
instanceof 型保護
class Animal{
name:string;
}
class Bird extends Animal{
swing:number
}
function getName(animal:Animal){
if(animal instanceof Bird){
console.log(animal.swing);
}else{
console.log(animal.name);
}
}
null
function getFirstLetter(s:string|null){
//最初の方法は、NULL判定を追加することである
if(s == null){
return '';
}
//これを処理する2つ目の方法は、関数のシグネチャに
s = s || '';
return s.charAt(0);
}
//これは、連鎖判定演算子を必要とする複雑な判定を扱わない。
function getFirstLetter2(s:string|null){
function log(){
console.log(s!.trim());
}
s = s || '';
log();
return s.charAt(0);
}
連鎖判定演算子
- 連鎖判定演算子は、属性へのアクセスを試みる前に、その属性が存在するかどうかをチェックする演算子です。
- 演算子の左側のオペランドが ? の左側のオペランドが未定義または NULL と評価された場合、式は未定義と評価されます。そうでない場合は、対象のプロパティ・アクセス、メソッド、または関数呼び出しが正常に起動されます。
a?.b; //もしaがnull/undefinedであればundefinedが返され、そうでなければaが返される。.b .
a == null ? undefined : a.b;
a?.[x]; //もしaがnull/undefinedであればundefinedが返され、そうでなければaが返される。[x]
a == null ? undefined : a[x];
a?.b(); // aがnull/undefinedの場合、undefinedが返される。
a == null ? undefined : a.b(); // .b関数でない場合は型エラー例外を投げる。.b()
a?.(); //aがnull/undefinedの場合、undefinedが返される。
a == null ? undefined : a(); //Aが関数でない場合、型エラーが投げられる。
//そうでない場合は、関数を
識別可能な協会の種類
- 型保護のためにユニオン型の共通フィールドを使用するテクニックです。
- 同じフィールドの異なる値は識別可能
interface WarningButton{
class:'warning',
text1:'
}
interface DangerButton{
class:'danger',
text2:'
}
type Button = WarningButton|DangerButton;
function getButton(button:Button){
if(button.class=='warning'){
console.log(button.text1);
}
if(button.class=='danger'){
console.log(button.text2);
}
}
in
- in 演算子は、パラメータの型を決定するために使用できます。
swing: number;
}
interface Dog {
leg: number;
}
function getNumber(x: Bird | Dog) {
if ("swing" in x) {
return x.swing;
}
return x.leg;
}
カスタムタイプの保護
- TypeScript における型保護は、基本的に、スコープ内の型が期待通りであることを確認するために、実行時に型情報をチェックする式です。
- 型プロテクションをカスタマイズするには、型プロテクションの戻り値が型述語である関数を定義するだけです。
- 型述語の構文は、parameterName is Typeの形をしており、parameterNameは現在の関数シグネチャのパラメータ名でなければなりません。
interface Bird {
swing: number;
}
interface Dog {
leg: number;
}
//型保存関数は、同じフィールドなしで定義することができる。
function isBird(x:Bird|Dog): x is Bird{
return (<Bird>x).swing == 2;
return (x as Bird).swing == 2;
}
function getAnimal(x: Bird | Dog) {
if (isBird(x)) {
return x.swing;
}
return x.leg;
}