Typescript 初嘗試!

December 21, 2024

Typescript 簡介

TypeScript是由微軟進行開發和維護的一種開源程式語言。TypeScript是JavaScript的嚴格語法超集,提供了可選的靜態型別檢查。

  • TypeScript extends JavaScript by adding types.
  • 一個基於 JavaScript 的超集合(SuperSet)
  • 提供型別系統(Type System),能夠在開發時期宣告型別
  • 支援 ECMAScript,可將 TS 檔編譯成 JS 檔給瀏覽器解讀

Typescript 功能

型別註解 Type annotation

在上述範例中,TypeScript 透過 Type annotation(型別註解),在參數或變數之後加上冒號 : type

// 變數的型別註解
let name: string = 'Heidi';   

// 函式參數/回傳值的型別註解
function sayHello(person: string): string {
    return 'Hello, ' + person;
}

一旦宣告型別,就不能使用其他資料型別進行賦值,否則程式就會報錯(但 TypeScript Compiler 還是會編譯成 JS 檔)。

型別推論 Type Inference 

在 TS 檔中檢視上述範例程式碼,會發現不管有無明確註記型別,TypeScript 編譯器都會依照「型別推論」的規則,自動推斷出一個資料型別。

又以下方程式碼為例,雖然沒有指定值的型別,卻會在編譯時報錯:

let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;

// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'

型別斷言 Type Assertion

// todo

2. 類型介紹

在變數後面用 : 宣告型別

// ===================== 基本類型 =====================
let str: string = 'hello world' // typescript這邊若有賦予變數值的話,會自動去推論型別,因此可以不用特別加

let str2: string // 沒有賦予值的時候需要加上宣告的型別
str2 = 123  // >>會報錯

let num: number = 1
let boo: boolean = true
let n: null = null
let un: undefined = undefined
let test: any = true // 盡量少用any

//  ===================== 陣列 =====================
const arr: string[] = ["a", "b"] // string array
const arr2: string[][] = [
  ["a", "b"],
  ["c", "d"],
] // 二維string array

//  ===================== Tuple 元組 =====================
const tom: [string, number] = ["Tom", 25]


//  ===================== Enum 枚舉、列舉 =====================
// 更詳細的用法可參考:https://medium.com/enjoy-life-enjoy-coding/typescript-%E5%96%84%E7%94%A8-enum-%E6%8F%90%E9%AB%98%E7%A8%8B%E5%BC%8F%E7%9A%84%E5%8F%AF%E8%AE%80%E6%80%A7-%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95-feat-javascript-b20d6bbbfe00

enum ButtonSize {
  Small = 0,
  Medium = 1,
  Large = 2,
}

const ctaButton = ButtonSize.Medium
console.log(ctaButton)

//  ===================== Union =====================
// 聯合型別(Union Types)表示取值可以為多種型別中的一種。
let aaa: number | string
aaa = 123
aaa = "123"
aaa = true // >>會報錯

//  ===================== Type =====================
// 可以藉由type來重復使用型別
type A = number | string
let a1: A
a1 = 123
a1 = "123"
a1 = true // >>會報錯

type Post = {
  title: string
  index: number
}

const obj: Post = {
  title: "test",
  index: 1,
  content: "content", // 會報錯,沒有在type裡面定義
}

//  ===================== Interface =====================
interface User {
  name: string
  age: number
}

//  ===================== Object =====================
// *type跟interface兩者的差異在「是否能擴充」

interface Post1 {
  title: string
  index: number
}
// interface可以繼承之前Post1的並做擴充,但是type不行
interface Post1 {
  content: string
  keywords?: [] // ?為可選
}
const obj1: Post1 = {
  title: "test",
  index: 1,
  content: "content", 
}

//  ===================== function =====================
// 參數後用:定義型別
// 參數括號後面用 : 定義return的型別
const sum = (x: number, y: number): number => {
  return x + y
}


//  ===================== 泛形 =====================
// 有的時候參數的type會變動,為了避免重複寫一堆不同type的func,可以使用泛形在呼叫func時去做type的定義
const print<T> = (data:T) => {
	console.log(data)
}

print<number>(123)
print<string>(123) // ->會報錯
print<string>("123") // -> 不會報錯


bookmark