今天終於步入到類別( Class )與介面( Interface )的章節了,在大型專案開發的過程中,往往離不開物件導向( object-oriented programming language )的概念,而其中類別就是組織龐大專案的重要零組件。 TypeScript 很大程度上借鑑於 C# ,並支援像是可見性修飾詞(visibility modifier)、 特性初始器( property initializer)、多型( polymorphism )、 裝飾器( decorator )和介面( interface )等功能,當然 JavaScript 的慣用語,如 mixin 也是還保留著,並盡可能擁有安全性。
是物件導向程式設計(Object-Oriented Programming, OOP)中的核心概念,類別不僅定義了物件的屬性和函式,允許程式繼承和多型。這意味著我們可以建立一個新的類別,繼承現有類別的屬性和方法,同時還可以覆蓋或擴展它們。這使得程式碼更具可讀性和可重用性。
類別:視為一個模板或藍圖,用於創建具體的物件(實例)。例如,「汽車」可以是一個類別,而具體的「Toyota Corolla」或「Honda Civic」則是由該類別建立的實例。
在高中生物課本上有一種專門分類動植物的系統叫做生物分類法,其中就以「界門綱目科屬種」為主,像是人類就是動物界→脊索動物門→哺乳綱→靈長目…,也就是說透過這些事先定義好的「界門綱目科屬種」我們也能自己創造某個動物,只要他們符合曾經設計的藍圖。
TypeScript Class 與 JavaScript Class 是不一樣的東西,但是最後編譯完成還是會變成類似的東西。
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
introduction() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
使用 class 宣告一個類別為 Person ,並在其中定義了一些屬性( name, age )、 constructor 作為建構子(類別建立的時候,會先進行運作的函式)和一個函式 introduction 。 也就是未來我建立了其他如學生、老師的時候也通常會有這些東西。(可以大幅減少程式碼的重複性)。
class Car {
public brand: string;
private model: string;
protected year: number;
}
public
:公開訪問。private
:只能在類別內部訪問。protected
:可以在類別內部和所有子類別中訪問。class Teacher extends Person {
suject: string;
constructor(name: string, age: number, suject: string) {
super(name, age);
this.suject = suject;
}
introduce() {
super.introduction();
console.log(`I teach the ${this.suject}.`);
}
}
extends
:繼承於某某的功能或屬性。super
:可以讓我們去調用父類別( Person )的東西。介面主要用來定義物件的約定結構。它不包含具體的執行,只是提供了一個 約定
。
interface PersonInterface {
name: string;
age: number;
introduction(): void;
}
class Student implements PersonInterface {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
introduction() {
console.log(`Hi! I'm a student named ${this.name}.`);
}
}
implements
:用來實踐( interface)時用的關鍵字。interface PersonInterface {
name: string;
gender?: string; // 可選屬性
readonly age: string; // 唯讀屬性
}
interface IntroductionFunc {
(name: string): void;
}
let introduction: IntroductionFunc;
add = (name) => console.log(name);
當然類別與介面的部分章節其實沒有這麼少,但是如果在介紹下去可能就沒時間用小專案了,因此我覺得還是把進階的東西留到後面一點去講~很開心與大家一起完成這十天來有關於 TypeScript 的基礎認知,但正如古人所言,讀萬卷書不如行萬里路,學習的過程中,真正能讓知識鞏固的往往來自於實踐。因此接下來的幾天將會開始動手寫一個小專案,開始將理論轉換為實踐,希望各位能陪我一起繼續走下去~