typescript handbook 學習筆記4
阿新 • • 發佈:2018-03-28
div cte 學習筆記 point name tsl urn 添加 diamond
概述
這是我學習typescript的筆記。寫這個筆記的原因主要有2個,一個是熟悉相關的寫法;另一個是理清其中一些晦澀的東西。供以後開發時參考,相信對其他人也有用。
學習typescript建議直接看中文文檔或英文文檔。我是看的英文文檔。
typescript handbook 學習筆記3
類
基本使用
class Greeter { //只讀,必須在聲明的時候或者constructor裏面初始化 readonly greeting: string; //constructor裏面的只讀 constructor(readonly message: string) { this.greeting = message; } greet() { return 'Hello, ' + this.greeting; } } class Greeter01 extends Greeter { constructor(message: string = 'everyone') {super(message);} greet() { return 'hi, ' + this.greeting; } } let sam = new Greeter01('world'); sam.greet();
public, private和protected
- public是默認的,如果不聲明就是public。
- private指只能內部訪問,不能被子類訪問。
- protected指只能被內部或者子類的實例訪問。
註意:
- 2個類相同,除了成員相同之外,private和protected的元素必須來自於同一處代碼。
- 如果一個類的constructor被標記為protected,那麽表示這個類不能被實例化,只能通過它生成子類,然後實例化子類。
存取器
存取器能夠攔截並重寫讀寫屬性的操作,如果只有get沒有set就會被認為是只讀的。
let language = { log: ['example', 'test'], set current(name) { this.log.push(name); }, get current() { if (this.log.length === 0) { return undefined; } else { return this.log[this.log.length - 1]; } } } language.current = 'EN'; console.log(language.current);
靜態屬性和方法
在屬性或方法前面加上static就是靜態屬性或方法了,實例屬性或方法用this訪問,靜態屬性或方法用類名來訪問。
抽象類
抽象類和接口類似,只能被繼承,不能被實例化,和接口不同的是,抽象類可以定義一些方法,這些方法可以被繼承。
抽象類也有抽象屬性,抽象屬性和接口一樣,一定要在子類中實現。
類當做接口使用
很好理解,看下面這段代碼即可。
class Point { x: number; y: number; } interface Point3d extends Point { z: number; } let point3d: Point3d = {x: 1, y: 2, z: 3};
函數
簡寫形式和完整形式
由於編譯的時候可以從簡寫形式推斷出完整形式,所以推薦用簡寫形式。
//簡寫形式
function add(x: number, y: number): number {
return x + y;
}
let myAdd = function(x: number, y: number): number { return x + y; };
//完整形式
let myAdd: (x: number, y: number) => number =
function(x: number, y: number): number { return x + y; };
可選參數和默認參數
//可選參數
function buildName(firstName: string, lastName?: string) {
return firstName + " " + lastName;
}
//默認參數
function buildName(firstName: string, lastName = "Smith") {
return firstName + " " + lastName;
}
可選參數和默認參數的函數類型是相同的:(firstName: string, lastName?: string) => string
。為了書寫方便,默認參數寫在後面比較好。
參數多的話也可以解構和展開,示例如下:
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;
this
關於this的原理請看這裏:理解js中的函數調用和this。
如果遇到this報錯,可以通過添加this: void或者this: 類名 來解決。
註意下面這種直接用等號的寫法是一種實驗性的寫法,es6並不支持,只在es7上做了提案。但是typescript和react都對這種寫法做了支持.
//用瀏覽器的審查元素運行,會報錯
class Handler {
onClickGood = () => { console.log(this); }
}
一般如果要用等號的話,我們需要寫在constructor裏面(註意要加this)。
//寫在constructor裏面
class Handler {
constructor() {
this.onClickGood = () => { console.log(this); }
}
}
let myHandler = new Handler();
myHandler.onClickGood();
函數重載
看下面的例子,註意前2個才是函數重載,最後一個是函數聲明。在編譯的時候,會逐一判斷函數類型,如果這2個都不符合,就會報錯。
let suits = ["hearts", "spades", "clubs", "diamonds"];
function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
// Check to see if we're working with an object/array
// if so, they gave us the deck and we'll pick the card
if (typeof x == "object") {
let pickedCard = Math.floor(Math.random() * x.length);
return pickedCard;
}
// Otherwise just let them pick the card
else if (typeof x == "number") {
let pickedSuit = Math.floor(x / 13);
return { suit: suits[pickedSuit], card: x % 13 };
}
}
typescript handbook 學習筆記4