Annotations

  1. Parameter Type

定義傳入值類型

1
2
3
function greet(name: string) {
console.log("Hello " + name);
}
  1. Return Type

定義回傳值類型

1
2
3
function age(): number {
return 25;
}
  1. Anonymous
1
2
3
4
const names = ['Alice', 'Bob'];
names.forEach((s) => {
console.log(s);
});

物件作為函式值

如果有部分property是optional,在property後方加上問號「?」

1
2
3
4
function printName(obj: {first: string, last?: string}) {
console.log(obj.first);
console.log(obj.last?);
}

兼容不同資料類型(Union type)

以下範例可接受數值或字串的輸入。

1
2
3
4
5
6
function printId(id: number | String) {
console.log(id);
}

printId(101);
printId("202);

Union type會遇到的問題

若方法沒辦法「都」應用到union所定義的資料類型,會顯示錯誤:

1
2
function printId(id: number | String) {
console.log(id.toUpperCase());

解決方法可以狹義資料類型,使用typeof:

1
2
3
4
function printId(id: number | String) {
if (typeof id === "string") { ... }
else { ... }
}

類型別名(Type alias)

定義資料的類型並重複使用,舉例來說我們可以簡化例子中的obj:

1
2
3
4
5
6
7
8
9
function printName(obj: {first: string, last?: string}) {
console.log(obj.first);
console.log(obj.last?);
}

// 簡化
type FullName = {first: string, last?: string};

function printName(obj: FullName) { ... }

Interaface

寫法和type alias相同。
interface和type alias的差別是,type alias不同被重新打開來增加新property,而interface可以一直extend。

類型斷言(type assertion)

告訴Typescript某個物件的資料類型,下方例子是斷言了value的類型是字串:

1
2
3
4
5
let value: any = "a string";
// 寫法一
let length: number = (<string>value).length;
// 寫法二
let length: number = (value as string).length;

參考文章:
https://www.typescriptlang.org/docs/handbook/2/everyday-types.html
https://www.typescriptlang.org/docs/handbook/2/functions.html