Type Script-クラス

2677 ワード

Type Scriptは構造タイプのシステムです.二つのタイプを比較する時、彼らの構造が同じかどうかだけに注目します.彼らの原型が同じかどうかを気にするのではありません.
しかし、私たちがクラスについて話した時、上の結論はいつも正しいとは限らないです.これは私達のクラスの属性がpublicですか?prvateですか?それともprotectedですか?
一:クラスのすべての属性はpublicです.
まず、あなたが特別に指定しない場合、クラスの属性はデフォルトではpublicです.
あるクラスに基づいてnewで出てきた2つのオブジェクトのタイプが互換性があるかどうかは、このオブジェクトの構造が一致しているかどうかを見る限り、対応するクラスは必ずしも同じではないということです.しかし、この針だけはクラスのすべての属性に対してpublicの時です.次の例を見てください.
class Animal { 
    name: string;
    constructor(name: string) { 
        this.name = name;
    }
}
class Person { 
    name: string;
    constructor(name: string) { 
        this.name = name;
    }
}

let animal: Animal = new Animal('kitty');
let person: Person = new Person('nana');
animal = person; //        ,  animal person      
animal = 1; //  ,  number  animal     。
二:Classがprvateまたはprotect属性を持っている時、Classがprvateまたはprotectedの属性を持っている時、構造が同じだけで、タイプが同じ結果をもたらすことができません.
class Animal { 
    private name: string;
    constructor(name: string) { 
        this.name = name;
    }
}
class Person { 
    name: string;
    constructor(name: string) { 
        this.name = name;
    }
}

let animal: Animal = new Animal('kitty');
let person: Person = new Person('nana');
animal = person; //Error,      
このコードは、Animalのnameをprvateにしただけで、構造は変わりませんでしたが、animalとpersonはすでにタイプが違っています.私たちはpersonをアニマルに賦課すると、errorが得られます.
ここではアニマルの属性をprvateに変更し、protectedに対しても同じ結果です.Public、Protect、Privateの違い
1: public   ,   instance   
2: protect   ,    instance   ,             
3: private   ,    class    
たとえば:
class Animal { 
    public category: string;
    protected color: string;
    private name: string;

    constructor(category: string, name: string, color: string) { 
        this.category = category;
        this.name = name;
        this.color = color;
    }
}
class Cat extends Animal { 
    constructor(category: string, name: string, color: string) {
        super(category, name, color);
    }
    printInfo() { 
        console.log(`The category of the cat is ${this.category}`); // No Error
        console.log(`The color of the cat is ${this.color}`);// No Error
        console.log(`The name of the cat is ${this.name}`);//Error!
    }

}
let animal = new Animal('animal', 'animal', 'white');
let cat = new Cat('cat', 'kitty', 'black');
animal.category = 'animal_1';//No Error.    instance   public   
console.log(cat.color);//Error!   insatance   protect   
要約すると、私たちの属性アクセス権限は三つのレベルがあります.
1:   instance    :public
2:          :public protected
3:    class     :private