# Essential TypeScript ## CH1&2 ## News - We are pleased to learn that dhh remove TS on Turbo 8 - https://github.com/hotwired/turbo/pull/971/files - https://github.com/hotwired/turbo/pull/972 ## History - Version 5.2.2 - TypeScript 0.8(2012) 靜態類型檢查、介面、類別、泛型和模組 - TypeScript 1.0(2014) - (Typescript(ES6(ES5))) 超集合 ## Init - Install node, npm(yarn), typescript - `npm install -g typescript@latest` - `npm init --save` ```json // pagkage.json { "name": "typescript", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } ``` - Install VScode extension: ![](https://hackmd.io/_uploads/HkzW1G8Ah.png) - Add a `tsconfig.json` - tsc --init ```json { "compilerOptions": { "target": "ES2020", "outDir": "./dist", "rootDir": "./src", } } ``` ## TypeScript vs JavaScript ### 增進生產力 - 型別type - TypeScript - Structuraly Type - JavaScript - Duck Type ```typescript= type Profile = { first_name: string; last_name: string; } ``` - 介面interface - 可以合併(相較於type) ```typescript= interface Profile { first_name: string; last_name: string; } ``` - 泛型generic type - 命名規則 - T 指type or template - U/V - Label/Value/Input ```typescript= class Container<T> { private value: T; constructor(value: T) { this.value = value; } getValue(): T { return this.value; } } let container1 = new Container<number>(42); let container2 = new Container<string>("Hello, TypeScript"); ``` - 類別class - public/private/protected - interface - generic ```typescript= class Student implements Profile { first_name: string; last_name: string; constructor() {}; } ``` - .ts -> (tsc) -> .js ### 產能提升的陷阱 - 我們又回到了Java/C++/C#的世界 !? - 學習曲線: 如果你和團隊成員之前沒有使用 TypeScript,學習 TypeScript 的型別系統和工具鏈可能需要一些時間。初學者可能會感到困惑,需要時間來適應新的概念和語法。 - 型別定義複雜性: 在複雜的應用程式中,型別定義可能會變得非常複雜,尤其是當涉及到高度巢狀的資料結構、複雜的泛型和聯合型別時。維護這些型別定義可能會變得困難。 - 型別註釋冗長: 在大型專案中,需要對大量的變數、函數和物件進行型別註釋,這可能會導致程式碼變得冗長。在某些情況下,過度的型別註釋可能會增加程式碼的複雜性。 - 型別安全性與彈性的平衡: TypeScript 的型別系統可以強化型別安全性,但有時也可能過於限制彈性。在一些情況下,需要做出權衡,以便在保持型別安全性的同時實現所需的功能。 - 第三方庫的型別支援: 不是所有的第三方 JavaScript 庫都有完善的 TypeScript 型別定義。在使用這些庫時,你可能需要自己撰寫或尋找社群維護的型別定義檔案,這可能會花費一些額外的工作。 - 編譯時間增加: 在使用 TypeScript 的專案中,編譯時間可能會比純 JavaScript 專案更長,特別是在大型專案中。這可能會影響開發工作流程的速度。 - 團隊協作挑戰: 如果你的團隊中的一些成員不熟悉 TypeScript,可能需要花時間培訓他們或確保他們能夠有效地協作。維護一致的型別註釋和程式碼風格規範也可能是一個挑戰。 ### 相容於舊版本的JavaScript - 能編譯出任何版本 - 無需更改現有 JavaScript 代碼: 你可以將現有的 JavaScript 代碼(包括 ES5 和 ES3)直接用作 TypeScript 代碼,而無需對其進行任何更改。TypeScript 會將 JavaScript 代碼視為有效的。 - 逐漸引入類型: TypeScript 允許你在不同的變數、函數和物件上添加類型註釋,這樣你可以逐漸引入類型檢查,而不必一次性更改整個程式碼庫。這種漸進式的過渡方式使得將 TypeScript 引入現有 JavaScript 項目變得更容易。 - 選擇性的類型: TypeScript 的類型註釋是選擇性的,這意味著你可以只為那些你認為需要類型檢查的部分添加類型註釋,而對於其他部分保持不變。 - JavaScript 函數的引入: TypeScript 允許你使用 JavaScript 函數庫,而無需添加類型註釋。你可以通過使用類型定義文件(.d.ts)來告訴 TypeScript 有關這些庫的類型信息。 - ES6+ 功能支持: TypeScript 支持 ES6、ES7 等新版本 JavaScript 的功能,這些功能包括箭頭函數()=>{}、模板字符串`${}`、解構賦值`...`等。