# 面向對象特性
* **類**
類事TypeScript的核心,使用TypeScript開發時,大部分代碼都是些在類里面的。
類的定義,構造函數,以及類的繼承
類的定義

類的構造函數 constructor

實例化的時候 必須聲明規則

等同于

>注:在構造函數 constrector 中 參數聲明需要帶public 如果不帶public 則此類中 沒有聲明此屬性 類中就無法調用name
*****
extends 繼承另一個類


子類的構造函數必須調用父類
super 用于實現子類調用父類的構造函數

~~~
class Person{
name: string;
age: number;
constructor(public food:string = 'pig'){
}
eat(){
console.log(`人要吃${this.food}`);
}
}
class Gooder extends Person{
constructor(public job:string ,public food = '肉肉'){
super(food);
}
say(){
console.log(`ta說要好好干活,我是做${this.job}工作的`);
};
sleep = () => {
super.eat();
this.kiss();
console.log('好了 去睡覺');
};
kiss = () => {
console.log('睡覺前,需要親吻家人');
}
}
var a = new Person();
a.eat();
var b = new Gooder('教師');
b.say();
b.sleep();
~~~
> 注:在編寫代碼時,我在類中使用了箭頭函數的寫法,發現在繼承類調用時,不可以使用,故此我發現,箭頭函數的權限為private
*****
* **泛型**
參數化的類型,一般用來限制集合的內容
~~~
var worker: Array<Person> = [];
worker[0] = new Person();
worker[1] = new Gooder('宇航員');
console.log(worker);
~~~
一下截圖為 上面實例代碼運行結果

*****
* **接口**
用來建立某種代碼約定,使得其他開發者在調用某一個方法或者創建新的類時必須遵守接口所定義的代碼約定
接口聲明屬性
~~~
interface Iphone {
size: string;
colour: string;
}
class X {
constructor(public config: Iphone) {
}
}
var phone = new X(
{
size: 'X',
colour: 'golden'
}
);
~~~
接口聲明屬性和方法 使用implements 基礎接口類
~~~
interface Ip {
size: string;
site(): void;
}
class XX implements Ip{
size: string;
constructor(param: string){
this.size = param;
}
site(){
console.log('over');
}
}
~~~