---
# System prepended metadata

title: Essential TypeScript

---

# 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 的功能，這些功能包括箭頭函數()=>{}、模板字符串`${}`、解構賦值`...`等。


