welcome to Cheeto's blog

0%

TypeScript 從零開始:介面 ( interface )

TypeScript 從零開始:介面 ( interface )

TypeScript 是 JavaScript 的超集合,將強型別帶入 JavaSript,並提供對 ES6 的支援,而 TypeScript 由 Microsoft 開發,程式開源於 GitHub 上。

學習資源參考 TypeScript 新手指南

介面 ( interface )

interface 當中可以宣告它有哪些屬性,也能為該屬性宣告型別,但是 interface 只是一個輪廓,還是要再去把它的細節補上才能使用。

下面就讓我們繼續學習吧 ↓

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 編譯前
interface Person {
name: string;
age: number;
}

let fufu: Person = {
name: '小富',
age: 25,
}

// 編譯後
var fufu = {
name: '小富',
age: 25
};

當我們在宣告 interface 的時候,命名的首字通常會使用大寫,比較好避免跟一般的 class 搞混。

在介面當中不能少任何一個屬性:

1
2
3
4
5
6
7
8
9
10
interface Person {
name: string;
age: number;
}

let fufu: Person = {
name: '小富',
}

// 會報錯: Property 'age' is missing in type '{ name: string; }' but required in type 'Person'.

在介面當中不能多任何一個屬性:

1
2
3
4
5
6
7
8
9
10
11
12
interface Person {
name: string;
age: number;
}

let fufu: Person = {
name: '小富',
age: 25,
hair: '黑色',
}

// 會報錯: Type '{ name: string; age: number; hair: string; }' is not assignable to type 'Person'.

由此可知,在使用 interface 宣告的時候,必須它所設定的輪廓一模一樣,不能多也不能少!

可選屬性

interface 當中我不會每次都想要一模一樣呀,那我們該怎麼辦呢?

這時候就可以來學點可用屬性啦!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 編譯前
interface Person {
name: string;
age?: number;
}

let fufu: Person = {
name: '小富',
}

// 編譯後
var fufu = {
name: '小富'
};

只要在屬性後面加上 ?,那它就可以變成可有可無的屬性了!

任意屬性

前面講到可選屬性能夠讓屬性可有可無,但是我們想要多新增一個屬性該怎麼辦呢?

就讓我們繼續學下去吧!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 編譯前
interface Person {
name: string;
age?: number;
[propName: string]: any;
}

let fufu: Person = {
name: '小富',
age: 25,
hair: 9487,
}

// 編譯後
var fufu = {
name: '小富',
age: 25,
hair: 9487
};

任意屬性可以使用 [propName: string] 來定義。

但是如果我們把任意值換成型別判定的話,那麼確定屬性和可選屬性的型別都必須是它的型別的子集

1
2
3
4
5
6
7
8
9
10
11
12
13
interface Person {
name: string;
age?: number;
[propName: string]: string;
}

let fufu: Person = {
name: '小富',
age: 25,
hair: '黑色',
}

這邊就會報錯,只要在任意屬性上定義型別,那所有的確定屬性跟可選屬性的型別都必須是它的型別子集。

只要在任意屬性上定義型別,那所有的確定屬性跟可選屬性的型別都必須是它的型別子集。

任意屬性的這個特點要特別注意。