2 回答

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
1. Typed Tuple
雖然 JavaScript 里一直沒(méi)有正宗的 Tuple 類(lèi)型,但是在 JavaScript 中使用 Tuple 一直都是很常見(jiàn)的事情,可以基于數(shù)組也可以基于對(duì)象,有了解構(gòu)賦值以后用數(shù)組還是對(duì)象的代碼量幾乎完全相同。
在 TypeScript ,如果我們需要一個(gè)具有靜態(tài)類(lèi)型的 Tuple,一種方式是定義一個(gè) interface 然后使用對(duì)象,但是這樣看起來(lái)比較麻煩。
另一種方式就是直接使用 TypeScript 提供的 Tuple 類(lèi)型:
let error: [number, string] = [123, 'Some Message'];
在 TypeScript 的類(lèi)型標(biāo)注中,當(dāng)我們把類(lèi)型寫(xiě)在方括號(hào)之前,就是 Typed Array,當(dāng)類(lèi)型寫(xiě)在方括號(hào)之中,就是 Typed Tuple 了。接著我們就可以使用類(lèi)型安全的方式解構(gòu)或者手動(dòng)取值:
// Both correctly typed
let [code, message] = error; // code is number and message is string
let anotherCode = error[0]; // anotherCode is number
let anotherMessage = error[1]; // anotherMessage is string
2. String Literal Type
當(dāng)我們需要使用靜態(tài)可枚舉的內(nèi)容時(shí),最正統(tǒng)的方式當(dāng)然是使用 Enum。不過(guò)對(duì)于一些需要和已有 JavaScript 類(lèi)庫(kù)交互時(shí),必須得使用 String 類(lèi)型,這時(shí)候往往會(huì)難以進(jìn)行靜態(tài)檢查(例如拼寫(xiě)錯(cuò)誤)。
這時(shí)候,可以使用 TypeScript 提供的 String Literal Type:
class Socket {
on (event: 'open' | 'message' | 'error' | 'close', cb) {
// ...
}
}
let mySock = new Socket();
socket.on('message', () => {});
這樣,如果傳入的 String 不在預(yù)設(shè)范圍內(nèi),就會(huì)報(bào)錯(cuò),從而實(shí)現(xiàn)靜態(tài)檢查效果。
3. Void
對(duì)于所有沒(méi)有返回值的函數(shù)或者方法,都應(yīng)該聲明為 Void 類(lèi)型,而不是留空,后者為 Any 類(lèi)型。
function log(message: string): void {
// ...
}
4. Implements Class
對(duì)于面向?qū)ο缶幊?,組合優(yōu)于繼承,但是對(duì)于組合,我們往往需要先定義一個(gè)接口類(lèi)型,然后再定義一個(gè)這個(gè)接口的實(shí)現(xiàn)類(lèi)型,十分繁瑣。
在 TypeScript 中,我們可以直接 Implements(而非 extends)一個(gè)(或多個(gè))類(lèi):
class Base1 {
method1 () {}
}
class Base2 {
method2 () {}
}
class MyClass implements Base1, Base2 {
constructor (private base1: Base1, private base2: Base2) {}
method1 () { return this.base1.method1(); }
method2 () { return this.base2.method2(); }
}
這樣,我們就不要像 Java 那樣先定義一個(gè) SomeInterface,再定義一個(gè) SomeImpl,再把自己的 Class 實(shí)現(xiàn) Interface,再把 SomeImpl 注進(jìn)來(lái)那么麻煩了。
添加回答
舉報(bào)