TypeScript: Any, Array, Union Types, Enum, Function, and Interface

此篇繼續來看 TypeScript 的基本語法。

Any

在 TypeScript 中,可用 any 來表示允許賦值是任意型別。

如果使用普通型別,在賦值過程中改變型別是不被允許的,但如果是 any 型別,則允許。以下程式將能順利被編譯。

1let myNumber: any = 'nine';
2myNumber = 9;

型別推論

如果沒有明確地指定型別,那麼 TypeScript 會依照型別推論(Type Inference)的規則推斷出型別。例如:

1let myNumber = 'nine';
2myNumber = 9;

編譯以上程式碼會收到錯誤。原因是 TypeScript 遇到賦值時會推斷出變數的型別是 string,爾後重新賦值時不允許改變型別。

但如果宣吿變數時沒有指定型別也沒有賦值,則它會被推斷成任意型別 (any),所以以下程式碼會通過編譯。

1let myNumber;
2myNumber = 'nine';
3myNumber = 9;

Array

宣告 Array 型別其實很單純:

  • an array of number: number[]
  • an array of string: string[]
1const numArray: number[] = [1, 2, 3];

Union Types

聯合型別(Union Types)表示取值可以為多種型別中的一種。

1let myNumber: string | number;
2myNumber = 'nine';
3myNumber = 9;

當 TypeScript 不確定一個聯合型別的變數到底是哪一個型別時,我們只能存取所有型別裡共有的屬性或方法。

1function getLength(something: string | number): number {
2  return something.length; // error: 因為 number 沒有 `length` 屬性
3}
1function getLength(something: string | number): number {
2  return something.toString(); // works
3}

Enum (列舉)

Enum 型別經常被用在變數值有一定範圍的場景,例如一週 7 天、篩選選項等等。

我們用 enum 關鍵字來定義變數:

1enum Filters {
2  ALL,
3  ACTIVE,
4  PAST_DUE,
5}

列舉的項目會被賦值從 0 開始遞增的數字,同時也會有數字到列舉值的反向對映,所以如果我們印出 Filters,會看到:

1{
2  '0': 'ALL',
3  '1': 'ACTIVE',
4  '2': 'PAST_DUE',
5  ALL: 0,
6  ACTIVE: 1,
7  PAST_DUE: 2,
8}

我們可用 Filters.PAST_DUE 來取得列舉項目的值。

Enum 還有更多應用,包括手動賦值、常數列舉等等,有興趣的話可再去閱讀官方文件

Function

定義函式時,要使用 TypeScript 約束函式的輸入和輸出,例如:

Normal Function

1function sum(num1: number, num2: number): number {
2  return num1 + num2;
3}

Arrow Function

1const sum = (num1: number, num2: number): number => {
2  return num1 + num2;
3}
4
5sum(1, 2);     // works
6sum(1, 2, 3);  // works: more arguments are ignored

Optional Parameters

如果某參數為 optional,可用 ? 來處理:

1function f(x?: number) {
2  // ...
3}
4
5f(); // OK
6f(10); // OK

Interface

在 TypeScript 中,我們使用 interface 來定義物件 (object) 的型別或形狀。以下是一個簡單的例子:

1interface Person { // interface naming 通常首字母是大寫
2  name: string;
3  gender: string;
4}
5
6let Amy: Person = {
7  name: 'Amy',
8  age: 25
9};

可以使用 readonly property 來定義唯讀的物件屬性:

1interface Person {
2  readonly name: string;
3  gender: string;
4}

interface 的更多應用請見官方文件

References