# 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/