---
# System prepended metadata

title: TypeScript
tags: [typescript]

---


# TypeScript


## restart TS server
https://blog.csdn.net/YopenLang/article/details/127120638

https://www.youtube.com/watch?v=GinkGJZBHIY&list=WL&index=88&ab_channel=%E5%B8%83%E9%AD%AF%E6%96%AF%E5%89%8D%E7%AB%AF
布魯斯前端建議說不用特別寫一個變數的type，那因為正常如果寫

```
let boo:boolean =true

boo = 1 // 就會報錯
```

那如果我寫以下報錯嗎？會，ts會在第一次賦值時，自動將變數判別型別。

```
let boo = true

boo =1 //一樣會報錯
```


以下類型宣告有著相同作用：
const list:number[] 
const list:Array<number>
    
### 泛型
    
將類型先宣告成變數可用以下，之後再做賦值，先宣告一個類型的變量T，因為我希望傳入的值與返回的值是同一種類型(就不用都寫any，反而有寫等於沒寫)，可以說function identity的型別就是泛型：
    
```
    function identity<T>(arg: T): T {
    return arg;
}
```
    
泛型參考：
https://www.tslang.cn/docs/handbook/generics.html

一個蠻好的寫法：
    
![](https://hackmd.io/_uploads/B1wGnwa8n.png)

    
type interface  差別
    

### Extends & implements
    
extends有幾個點要注意
    interface和class都可以說使用extend去繼承，但是interface可以多重繼承，class不行，class要使用多重繼承，要使用implements和Mixins
    
implement通常用在實踐抽象的interface，並且在implement的過程，就會具體化？

### TypeScript/Javascript的特殊運算符

https://segmentfault.com/a/1190000023943952

### ?. 運算符(js也有)

可選鏈(Optional Chaining)，可以寫 a?.b?.c，要這麼使用的原因是例如，假設a有的狀況下是object有的狀況又不會有值得話，程式會直接跳error，但若我們希望程式不要停掉，就告訴我undefined就好，就可以這樣使用。
    
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
    
### ?? 空值合併運算符

跟```||```有點像，差別是```??```是當值為null 或undefined的時候返回另一邊，```||```是會判斷直是否為falsy值

    
### ! 非空斷言操作符
    
ts中可以幫助排除null和 undefined的變數
[參考資料](https://juejin.cn/post/6844904149897723917) 


### unknown VS any
unknown 不能直接用
any可以直接用
    
    
## 開始使用typescript(ts-config)

```
{
  "compilerOptions": {
    /* Basic Options */
    "target": "ES2018", // compile 後要支援到的 ECMAScript 版本
    "module": "commonjs", // compile 後程式碼會用 commonjs 來處理模組的匯出匯入
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": false, // 是否允許匯入 js 檔，會影響到 include 時解析的副檔名是否包含（.js 和 .jsx）
    "declaration": true,
    ”noEmitOnError“: true,

    // 如果沒設定會套用預設值（TS 自動判斷）
    // 有「機會」導致 src 的資料夾也一起被 build 到 dist 資料夾中
    // 例如 TS 自動把 rootDir 判斷為 { "rootDir": "." }
    "rootDir": "src",

    // 預設 tsc 會直接把編譯好的 js 檔放在與 ts 檔相同的路徑，但這樣檔案會很散亂，因此全部放到 dist
    "outDir": "dist",

    /* Strict Type-Checking Options */
    "strict": true,

    /* Additional Checks */
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true, // 確保 switch case 都會有 break 或 return

    /* Module Resolution Options */
    "baseUrl": "./", // 匯入模組時，路徑可以使用從 baseUrl 開始，而不需要 ./../ 這種寫法
    "paths": {
      "@": ["src"] // 將 @ map 到 src
    },
    "esModuleInterop": false,

    /* Source Map Options */
    "sourceMap": true,

    /* Advanced Options */
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true // 確保檔案的大小寫一致，避免某些作業系統對大小寫不敏感
  },
  "include": ["src/**/*.ts"], // compiler 要做用在哪些檔案上
```
參考：https://pjchender.dev/typescript/tsconfig-and-tsc/

*ts compiler也可以自由的編譯成想要的js版本(es5前是用require es6後用import)



`tsc --init`


`tsc --noEmit`


noEmitOnError:true

js模塊 https://www.freecodecamp.org/news/modules-in-javascript/