SlideShare a Scribd company logo
An gu la r
User Group Taiwan
TypeScript 綜合格鬥技
多奇數位創意有限公司
技術總監 黃保翕 ( Will 保哥 )
部落格:http://blog.miniasp.com/
Angular 線上讀書會 第 3 季
An gu la r
User Group Taiwan
TypeScript 編譯器
An gu la r
User Group Taiwan
找出 TypeScript 編譯器的路徑與版本
若 PATH 環境變數有問題,使用 Rapid Environment Editor 可快速修復!
npm list -g --depth=0
where tsc
tsc -v
An gu la r
User Group Taiwan
tsc --init
初始化 tsconfig.json 設定檔
An gu la r
User Group Taiwan
編譯所有檔案 (讀取 tsconfig.json 設定檔) (預設編譯含子目錄下的所有檔案)
• tsc
編譯單一檔案 (需指定 TypeScript 編譯器選項)
• tsc [options] [file ...]
顯示完整的 TypeScript 編譯器選項
• tsc --all
顯示 tsc 編譯器摘要說明
• tsc -h
編譯 TypeScript 程式
An gu la r
User Group Taiwan
問題說明
• ng new --minimal demo1
• code demo1
• 透過 VSCode 檔案總管將 src/environments 目錄移到 src/app/ 目錄下
• npm start
Angular 下的 TypeScript 偵錯技巧
Allow to disable drag and drop in the files explorer #4842
( "explorer.enableDragAndDrop": false )
An gu la r
User Group Taiwan
Glob support in tsconfig.json
• * 代表 0 個到多個字元比對 (不含目錄分隔字元)
• ? 代表 1 個字元比對 (不含目錄分隔字元)
• **/ 代表比對任意子目錄
設定 Base URL 預設 import 的基底路徑
設定 Path mapping
• 必須搭配 "baseUrl" 設定一起使用
• Angular CLI 專案只能設定在根目錄的 tsconfig.json 設定檔中
tsconfig.json 設定技巧
An gu la r
User Group Taiwan
預設載入內建的模組定義檔 ( --lib )
es2015.core
es2015.collection
es2015.iterable
es2015.promise
es2015.proxy
es2015.reflect
es2015.generator
es2015.symbol
es2015.symbol.wellknown
dom (Angular 5)
webworker
es5
es6 / es2015
es2016
es2016.array.include
es2017 (Angular 5)
es2017.object
es2017.sharedmemory
scripthost
An gu la r
User Group Taiwan
TypeScript 型別應用
An gu la r
User Group Taiwan
let decimal = 100;
let isDone = false;
let fullName: string = `Will`;
let obj = {};
obj.name = 'Will';
let arr = [];
arr.push({});
自動型別推導 (Type Inference)
An gu la r
User Group Taiwan
列舉範例
• http://www.typescriptlang.org/play/index.html
列舉型別 (Enum)
var Day;
(function (Day) {
Day[ Day["Sunday"] = 0 ] = "Sunday";
Day[ Day["Monday"] = 1 ] = "Monday";
Day[ Day["Tuesday"] = 2 ] = "Tuesday";
Day[ Day["Wednesday"] = 3 ] = "Wednesday";
Day[ Day["Thursday"] = 4 ] = "Thursday";
Day[ Day["Friday"] = 5 ] = "Friday";
Day[ Day["Saturday"] = 6 ] = "Saturday";
})(Day || (Day = {}));
var d = Day.Friday;
enum Day {
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
var d = Day.Friday;
An gu la r
User Group Taiwan
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
let a = document.getElementById('myLink'); // HTMLElement 型別
a.href = "http://blog.miniasp.com/"; // 找不到 href 屬性
let a = <HTMLAnchorElement>document.getElementById('myLink');
a.href = "http://blog.miniasp.com/"; // OK
型別轉換 (Type assertions)
An gu la r
User Group Taiwan
排除過度屬性檢查的型別宣告技巧
允許任意屬性的物件宣告
interface ILabel {
label: string; // 必要屬性,必須傳入!
[propName: string]: any; // 允許任意屬性傳入
}
function printLabel(labelledObj: ILabel) {
console.log(labelledObj.label);
}
printLabel({ label: "Size 10 Object", size: 10 });
An gu la r
User Group Taiwan
預設型別檢查模式 ( regular type checking mode )
• let a: T; // 可以指派給 undefined 或 null
// 因為 undefined 與 null 是所有型別的子型別
嚴格空值檢查模式 ( strict null checking mode ) ( --strictNullChecks )
• let a: T; // 不允許為 undefined 或 null (嚴格檢查)
• let a: T | null; // 不允許為 undefined 也代表要有初始值才能用
• let a: T | undefined;
• let a: T | undefined | null;
• 可選參數預設就擁有 undefined 型別,啟用嚴格空值檢查模式也一樣
type T1 = (x?: number) => string;
TypeScript 2.0 的嚴格空值檢查模式 (1)
An gu la r
User Group Taiwan
預設型別檢查模式 ( regular type checking mode )
• let a = null; // a 變數型別為 any
• let b = undefined; // b 變數型別為 any
嚴格空值檢查模式 ( strict null checking mode ) ( --strictNullChecks )
• let a = null; // a 變數型別為 null
• let b = undefined; // b 變數型別為 undefined
TypeScript 2.0 的嚴格空值檢查模式 (2)
An gu la r
User Group Taiwan
非空值斷言運算子 ( ! ) ( Non-null assertion operator )
TypeScript 2.0 的嚴格空值檢查模式 (3)
An gu la r
User Group Taiwan
傳統的聯合類型
• let a = number | string | undefined;
字串實字聯合類型 (String Literal Types)
• let b = "Will" | "John" | "Mary";
數值實字聯合類型 (Numeric Literal Types)
• function rollDie(): 1 | 2 | 3 | 4 | 5 | 6 { }
列舉成員聯合類型 (Enum Member Types)
• let kind: ShapeKind.Square | ShapeKind.Circle;
標記的聯合類型 ( 深度分析程式碼對型別的用法進而做出型別判斷 )
• https://github.com/Microsoft/TypeScript/wiki/What's-new-in-
TypeScript#tagged-union-types
標記的聯合類型 (Tagged union types)
An gu la r
User Group Taiwan
原始型別 never 用來宣告某個函式或變數永遠不可能有值
• let a: never = function test() { while (true) { } };
關於 void 型別的特性
• 宣告 void 型別的變數只能是 undefined 與 null ( 代表沒有值 )
• undefined 與 null 是所有型別的子型別 (subtype)
關於 never 型別的特性
• never 是所有型別的子型別 (subtype),所以不用特別宣告!
• 沒有任何型別是 never 的子型別 ( 除了 never 以外 )
• 若函式表達式或箭頭函式要能自動推導出 never 型別,有以下條件:
• 函式中沒有任何 return 敘述或回傳的只會有 never 型別
• 函式一定不能跑到函式最後一行 (end point of the function is not reachable)
TypeScript 2.0 推出的 never 原始型別
An gu la r
User Group Taiwan
TypeScript 1.x 以下的編譯器
• 預設函式內使用 this 預設型別為 any
TypeScript 2.0 編譯器新增 --noImplicitThis 旗標
• 在函式中預設無法使用型別為 any 的 this 變數!
• 如果要使用 this 必須在函式的第一個參數加入 this 的型別宣告
( 編譯之後的 JavaScript 會自動移除 this 參數 )
在函式中使用 this 的嚴格用法
An gu la r
User Group Taiwan
TypeScript 2.1 編譯器新增 --noImplicitAny 旗標
Untyped imports
• import { x } from "asdf";
• 匯入的模組如果沒有 declaration file,預設匯入的變數將會是 any 型別
• 如果啟用 --noImplicitAny 就會出現錯誤訊息
Improved any Inference
• let x; // implicitly 'any'
• let y = []; // implicitly 'any[]'
• let z: any; // explicitly 'any'
• 以前宣告完變數如果沒給型別宣告,預設就是隱含的 any 型別
• 如果啟用 --noImplicitAny 就會:
• 從第一次 assign 值的時候決定型別
• 如果執行的過程中修改了變數的值,型別也會動態轉換 (依然有編譯時期檢查)
Implicit any errors
• 有任何宣告出 any 型別的機會,就會立刻出現錯誤!
禁用隱含 any 型別功能
An gu la r
User Group Taiwan
TypeScript 2.1 編譯器新增 --alwaysStrict 旗標
啟用這個旗標會導致
• 所有的 TypeScript 程式碼都會以 strict mode 進行解析
• 所有輸出的 JavaScript 程式碼都會加上 "use strict"; 在每個 Scope
注意事項
• 所有相關模組都會自動進入嚴格編譯模式
• 建議用在 non-module 的程式碼
永遠採用嚴格編譯模式
An gu la r
User Group Taiwan
TypeScript 語言特性
An gu la r
User Group Taiwan
ES2017 Spread and Rest
• let copy = { ...original }; // shallow copy
• let merged = { ...foo, ...bar, ...baz }; // shallow copy
• let obj = { x: 1, y: "string" };
var newObj = {...obj, z: 3, y: 4};
// { x: number, y: number, z: number }
• let obj = { x: 1, y: 1, z: 1 };
let { z, ...obj1 } = obj;
obj1; // {x: number, y: number};
TypeScript 2.1 帶來 ES2017 的 … 功能
An gu la r
User Group Taiwan
TypeScript 2.1 讓 Async 函式支援到 ES3
An gu la r
User Group Taiwan
TypeScript - JavaScript that scales
What's new in TypeScript · Microsoft/TypeScript Wiki
TypeScript Handbook (中文版)
New in JavaScript - JavaScript | MDN
相關連結
An gu la r
User Group Taiwan
Thank you
An gu la r
User Group Taiwan
The Will Will Web
記載著 Will 在網路世界的學習心得與技術分享
• http://blog.miniasp.com/
Will 保哥的技術交流中心 (臉書粉絲專頁)
• http://www.facebook.com/will.fans
Will 保哥的噗浪
• http://www.plurk.com/willh/invite
Will 保哥的推特
• https://twitter.com/Will_Huang
聯絡資訊

More Related Content

PPTX
保哥線上講堂:LINQ 快速上手
PDF
如何用JDK8實作一個小型的關聯式資料庫系統
PPTX
ES5 introduction
PDF
Clojure
PDF
Spock:願你的測試長長久久、生生不息
PDF
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
KEY
Scala
PDF
千呼萬喚始出來的 Java SE 7
保哥線上講堂:LINQ 快速上手
如何用JDK8實作一個小型的關聯式資料庫系統
ES5 introduction
Clojure
Spock:願你的測試長長久久、生生不息
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
Scala
千呼萬喚始出來的 Java SE 7

What's hot (20)

PPTX
12, string
PDF
Java Tutorial:Learn Java in 06:00:00
PDF
TypeScript-twmvc#16
PDF
Java 8 與 retrolambda
PDF
如何在 Java App 中導入 Scala
PPTX
Ecma script edition5-小试
PPTX
Groovy:Candy for Java Developers
PDF
CH11:執行緒與並行API
PPT
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
PDF
TypeScript
PPTX
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
PDF
淺談 Groovy 與 Gradle
PDF
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
PDF
2. 從 REPL 到 IDE
PPTX
Reactive X 响应式编程
PDF
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
PPTX
IOS入门分享
PPTX
为啥别读HotSpot VM的源码(2012-03-03)
PDF
使用 RxJava 让数据流动 (Let data streaming using rxjava)
PPT
Javascript 培训第三节 基础下
12, string
Java Tutorial:Learn Java in 06:00:00
TypeScript-twmvc#16
Java 8 與 retrolambda
如何在 Java App 中導入 Scala
Ecma script edition5-小试
Groovy:Candy for Java Developers
CH11:執行緒與並行API
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
TypeScript
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
淺談 Groovy 與 Gradle
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
2. 從 REPL 到 IDE
Reactive X 响应式编程
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
IOS入门分享
为啥别读HotSpot VM的源码(2012-03-03)
使用 RxJava 让数据流动 (Let data streaming using rxjava)
Javascript 培训第三节 基础下
Ad

Viewers also liked (20)

PPTX
Angular 4 新手入門攻略完全制霸
PPTX
初學者都該了解的 HTTP 通訊協定基礎
PPTX
申請 Let's Encrypt 免費 SSL 憑證一次就上手
PPTX
Angular 4 網站開發最佳實務 (Modern Web 2017)
PDF
Designing with Sketch App
PPTX
App介面設計要點
ODP
PPT
SMS-SMPP-Concepts
PDF
Laravel - 系統全攻略(續)
PDF
Sketching for Design
PPTX
簡介 GitHub 平台
PPTX
ASP.NET 5 的創新與變革
PPTX
Azure Web App on Linux @ Global Azure Bootcamp 2017 Taiwan
PPTX
快速上手 Windows Containers 容器技術 (Docker Taipei)
PPTX
Growth Mindset 經驗分享
PPTX
使用 Angular 2 與 Firebase 實現 Serverless 網站架構 (JSDC.tw 2016)
PPTX
中小企業選擇雲端服務的實戰密技
PPTX
git merge 與 rebase 的觀念與實務應用
PPTX
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
PPTX
SQL Server 資料庫版本控管
Angular 4 新手入門攻略完全制霸
初學者都該了解的 HTTP 通訊協定基礎
申請 Let's Encrypt 免費 SSL 憑證一次就上手
Angular 4 網站開發最佳實務 (Modern Web 2017)
Designing with Sketch App
App介面設計要點
SMS-SMPP-Concepts
Laravel - 系統全攻略(續)
Sketching for Design
簡介 GitHub 平台
ASP.NET 5 的創新與變革
Azure Web App on Linux @ Global Azure Bootcamp 2017 Taiwan
快速上手 Windows Containers 容器技術 (Docker Taipei)
Growth Mindset 經驗分享
使用 Angular 2 與 Firebase 實現 Serverless 網站架構 (JSDC.tw 2016)
中小企業選擇雲端服務的實戰密技
git merge 與 rebase 的觀念與實務應用
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
SQL Server 資料庫版本控管
Ad

More from Will Huang (20)

PPTX
深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
PPTX
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
PPTX
ASP.NET Core 6.0 全新功能探索
PPTX
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
PPTX
你一定不能不知道的 Markdown 寫作技巧
PPTX
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
PPTX
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
PPTX
Micro-frontends with Angular 10 (Modern Web 2020)
PPTX
從實戰經驗看到的 K8S 導入痛點
PPTX
RxJS 6 新手入門
PPTX
极速 Angular 开发:效能调校技巧 (ngChina 2019)
PPTX
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
PPTX
Protractor: The Hacker way (NG-MY 2019)
PPTX
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
PPTX
Angular 开发技巧 (2018 ngChina 开发者大会)
PPTX
Angular 7 全新功能探索 (Angular Taiwan 2018)
PPTX
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
PPTX
AKS 與開發人員體驗 (Kubernetes 大講堂)
PPTX
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
PPTX
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
ASP.NET Core 6.0 全新功能探索
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
你一定不能不知道的 Markdown 寫作技巧
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
Micro-frontends with Angular 10 (Modern Web 2020)
從實戰經驗看到的 K8S 導入痛點
RxJS 6 新手入門
极速 Angular 开发:效能调校技巧 (ngChina 2019)
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
Protractor: The Hacker way (NG-MY 2019)
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
Angular 开发技巧 (2018 ngChina 开发者大会)
Angular 7 全新功能探索 (Angular Taiwan 2018)
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
AKS 與開發人員體驗 (Kubernetes 大講堂)
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)

TypeScript 綜合格鬥技

  • 1. An gu la r User Group Taiwan TypeScript 綜合格鬥技 多奇數位創意有限公司 技術總監 黃保翕 ( Will 保哥 ) 部落格:http://blog.miniasp.com/ Angular 線上讀書會 第 3 季
  • 2. An gu la r User Group Taiwan TypeScript 編譯器
  • 3. An gu la r User Group Taiwan 找出 TypeScript 編譯器的路徑與版本 若 PATH 環境變數有問題,使用 Rapid Environment Editor 可快速修復! npm list -g --depth=0 where tsc tsc -v
  • 4. An gu la r User Group Taiwan tsc --init 初始化 tsconfig.json 設定檔
  • 5. An gu la r User Group Taiwan 編譯所有檔案 (讀取 tsconfig.json 設定檔) (預設編譯含子目錄下的所有檔案) • tsc 編譯單一檔案 (需指定 TypeScript 編譯器選項) • tsc [options] [file ...] 顯示完整的 TypeScript 編譯器選項 • tsc --all 顯示 tsc 編譯器摘要說明 • tsc -h 編譯 TypeScript 程式
  • 6. An gu la r User Group Taiwan 問題說明 • ng new --minimal demo1 • code demo1 • 透過 VSCode 檔案總管將 src/environments 目錄移到 src/app/ 目錄下 • npm start Angular 下的 TypeScript 偵錯技巧 Allow to disable drag and drop in the files explorer #4842 ( "explorer.enableDragAndDrop": false )
  • 7. An gu la r User Group Taiwan Glob support in tsconfig.json • * 代表 0 個到多個字元比對 (不含目錄分隔字元) • ? 代表 1 個字元比對 (不含目錄分隔字元) • **/ 代表比對任意子目錄 設定 Base URL 預設 import 的基底路徑 設定 Path mapping • 必須搭配 "baseUrl" 設定一起使用 • Angular CLI 專案只能設定在根目錄的 tsconfig.json 設定檔中 tsconfig.json 設定技巧
  • 8. An gu la r User Group Taiwan 預設載入內建的模組定義檔 ( --lib ) es2015.core es2015.collection es2015.iterable es2015.promise es2015.proxy es2015.reflect es2015.generator es2015.symbol es2015.symbol.wellknown dom (Angular 5) webworker es5 es6 / es2015 es2016 es2016.array.include es2017 (Angular 5) es2017.object es2017.sharedmemory scripthost
  • 9. An gu la r User Group Taiwan TypeScript 型別應用
  • 10. An gu la r User Group Taiwan let decimal = 100; let isDone = false; let fullName: string = `Will`; let obj = {}; obj.name = 'Will'; let arr = []; arr.push({}); 自動型別推導 (Type Inference)
  • 11. An gu la r User Group Taiwan 列舉範例 • http://www.typescriptlang.org/play/index.html 列舉型別 (Enum) var Day; (function (Day) { Day[ Day["Sunday"] = 0 ] = "Sunday"; Day[ Day["Monday"] = 1 ] = "Monday"; Day[ Day["Tuesday"] = 2 ] = "Tuesday"; Day[ Day["Wednesday"] = 3 ] = "Wednesday"; Day[ Day["Thursday"] = 4 ] = "Thursday"; Day[ Day["Friday"] = 5 ] = "Friday"; Day[ Day["Saturday"] = 6 ] = "Saturday"; })(Day || (Day = {})); var d = Day.Friday; enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } var d = Day.Friday;
  • 12. An gu la r User Group Taiwan let someValue: any = "this is a string"; let strLength: number = (<string>someValue).length; let someValue: any = "this is a string"; let strLength: number = (someValue as string).length; let a = document.getElementById('myLink'); // HTMLElement 型別 a.href = "http://blog.miniasp.com/"; // 找不到 href 屬性 let a = <HTMLAnchorElement>document.getElementById('myLink'); a.href = "http://blog.miniasp.com/"; // OK 型別轉換 (Type assertions)
  • 13. An gu la r User Group Taiwan 排除過度屬性檢查的型別宣告技巧 允許任意屬性的物件宣告 interface ILabel { label: string; // 必要屬性,必須傳入! [propName: string]: any; // 允許任意屬性傳入 } function printLabel(labelledObj: ILabel) { console.log(labelledObj.label); } printLabel({ label: "Size 10 Object", size: 10 });
  • 14. An gu la r User Group Taiwan 預設型別檢查模式 ( regular type checking mode ) • let a: T; // 可以指派給 undefined 或 null // 因為 undefined 與 null 是所有型別的子型別 嚴格空值檢查模式 ( strict null checking mode ) ( --strictNullChecks ) • let a: T; // 不允許為 undefined 或 null (嚴格檢查) • let a: T | null; // 不允許為 undefined 也代表要有初始值才能用 • let a: T | undefined; • let a: T | undefined | null; • 可選參數預設就擁有 undefined 型別,啟用嚴格空值檢查模式也一樣 type T1 = (x?: number) => string; TypeScript 2.0 的嚴格空值檢查模式 (1)
  • 15. An gu la r User Group Taiwan 預設型別檢查模式 ( regular type checking mode ) • let a = null; // a 變數型別為 any • let b = undefined; // b 變數型別為 any 嚴格空值檢查模式 ( strict null checking mode ) ( --strictNullChecks ) • let a = null; // a 變數型別為 null • let b = undefined; // b 變數型別為 undefined TypeScript 2.0 的嚴格空值檢查模式 (2)
  • 16. An gu la r User Group Taiwan 非空值斷言運算子 ( ! ) ( Non-null assertion operator ) TypeScript 2.0 的嚴格空值檢查模式 (3)
  • 17. An gu la r User Group Taiwan 傳統的聯合類型 • let a = number | string | undefined; 字串實字聯合類型 (String Literal Types) • let b = "Will" | "John" | "Mary"; 數值實字聯合類型 (Numeric Literal Types) • function rollDie(): 1 | 2 | 3 | 4 | 5 | 6 { } 列舉成員聯合類型 (Enum Member Types) • let kind: ShapeKind.Square | ShapeKind.Circle; 標記的聯合類型 ( 深度分析程式碼對型別的用法進而做出型別判斷 ) • https://github.com/Microsoft/TypeScript/wiki/What's-new-in- TypeScript#tagged-union-types 標記的聯合類型 (Tagged union types)
  • 18. An gu la r User Group Taiwan 原始型別 never 用來宣告某個函式或變數永遠不可能有值 • let a: never = function test() { while (true) { } }; 關於 void 型別的特性 • 宣告 void 型別的變數只能是 undefined 與 null ( 代表沒有值 ) • undefined 與 null 是所有型別的子型別 (subtype) 關於 never 型別的特性 • never 是所有型別的子型別 (subtype),所以不用特別宣告! • 沒有任何型別是 never 的子型別 ( 除了 never 以外 ) • 若函式表達式或箭頭函式要能自動推導出 never 型別,有以下條件: • 函式中沒有任何 return 敘述或回傳的只會有 never 型別 • 函式一定不能跑到函式最後一行 (end point of the function is not reachable) TypeScript 2.0 推出的 never 原始型別
  • 19. An gu la r User Group Taiwan TypeScript 1.x 以下的編譯器 • 預設函式內使用 this 預設型別為 any TypeScript 2.0 編譯器新增 --noImplicitThis 旗標 • 在函式中預設無法使用型別為 any 的 this 變數! • 如果要使用 this 必須在函式的第一個參數加入 this 的型別宣告 ( 編譯之後的 JavaScript 會自動移除 this 參數 ) 在函式中使用 this 的嚴格用法
  • 20. An gu la r User Group Taiwan TypeScript 2.1 編譯器新增 --noImplicitAny 旗標 Untyped imports • import { x } from "asdf"; • 匯入的模組如果沒有 declaration file,預設匯入的變數將會是 any 型別 • 如果啟用 --noImplicitAny 就會出現錯誤訊息 Improved any Inference • let x; // implicitly 'any' • let y = []; // implicitly 'any[]' • let z: any; // explicitly 'any' • 以前宣告完變數如果沒給型別宣告,預設就是隱含的 any 型別 • 如果啟用 --noImplicitAny 就會: • 從第一次 assign 值的時候決定型別 • 如果執行的過程中修改了變數的值,型別也會動態轉換 (依然有編譯時期檢查) Implicit any errors • 有任何宣告出 any 型別的機會,就會立刻出現錯誤! 禁用隱含 any 型別功能
  • 21. An gu la r User Group Taiwan TypeScript 2.1 編譯器新增 --alwaysStrict 旗標 啟用這個旗標會導致 • 所有的 TypeScript 程式碼都會以 strict mode 進行解析 • 所有輸出的 JavaScript 程式碼都會加上 "use strict"; 在每個 Scope 注意事項 • 所有相關模組都會自動進入嚴格編譯模式 • 建議用在 non-module 的程式碼 永遠採用嚴格編譯模式
  • 22. An gu la r User Group Taiwan TypeScript 語言特性
  • 23. An gu la r User Group Taiwan ES2017 Spread and Rest • let copy = { ...original }; // shallow copy • let merged = { ...foo, ...bar, ...baz }; // shallow copy • let obj = { x: 1, y: "string" }; var newObj = {...obj, z: 3, y: 4}; // { x: number, y: number, z: number } • let obj = { x: 1, y: 1, z: 1 }; let { z, ...obj1 } = obj; obj1; // {x: number, y: number}; TypeScript 2.1 帶來 ES2017 的 … 功能
  • 24. An gu la r User Group Taiwan TypeScript 2.1 讓 Async 函式支援到 ES3
  • 25. An gu la r User Group Taiwan TypeScript - JavaScript that scales What's new in TypeScript · Microsoft/TypeScript Wiki TypeScript Handbook (中文版) New in JavaScript - JavaScript | MDN 相關連結
  • 26. An gu la r User Group Taiwan Thank you
  • 27. An gu la r User Group Taiwan The Will Will Web 記載著 Will 在網路世界的學習心得與技術分享 • http://blog.miniasp.com/ Will 保哥的技術交流中心 (臉書粉絲專頁) • http://www.facebook.com/will.fans Will 保哥的噗浪 • http://www.plurk.com/willh/invite Will 保哥的推特 • https://twitter.com/Will_Huang 聯絡資訊

Editor's Notes

  • #9: tsc --target es5 --lib es5,es2015.promise "compilerOptions": { "lib": ["es5", "es2015.promise"] }
  • #17: // Compiled with --strictNullChecks interface Entity { name: string; } function validateEntity(e?: Entity) { // Throw exception if e is null or invalid entity } function processEntity(e?: Entity) { validateEntity(e); let s = e!.name; // Assert that e is non-null and access name }
  • #25: function delay(milliseconds: number) { return new Promise<void>(resolve => { setTimeout(resolve, milliseconds); }); } async function dramaticWelcome() { console.log("Hello"); for (let i = 0; i < 3; i++) { await delay(500); console.log("."); } console.log("World!"); } dramaticWelcome();