1. 程式人生 > >Typescript學習日記—3

Typescript學習日記—3

1.外部列舉

外部列舉用來描述已經存在的列舉型別的形狀。

declare enum Enum {
    A = 1,
    B,
    C = 2
}

外部列舉和非外部列舉之間有一個重要的區別,在正常的列舉裡,沒有初始化方法的成員被當成常數成員。 對於非常數的外部列舉而言,沒有初始化方法時被當做需要經過計算的。

2.上下文型別

TypeScript型別推論也可能按照相反的方向進行。 這被叫做“按上下文歸類”。按上下文歸類會發生在表示式的型別與所處的位置相關時。

window.onmousedown = function(mouseEvent) {
    console.log(mouseEvent.button);  //<- Error
};

這句話就很好理解了。上下文可以理解為一篇文章的上下文內容,同樣的一句話,不同文章的上下文表達的意思也是不同的。上下文歸類就是根據所處的位置來判斷表示式的型別。比如例子中使用了Window.onmousedown函式的型別,來推斷出mouseEvent的型別。

3.上下文型別

上下文歸類會在很多情況下使用到。 通常包含函式的引數,賦值表示式的右邊,型別斷言,物件成員和陣列字面量和返回值語句。 上下文型別也會做為最佳通用型別的候選型別。比如:

function createZoo(): Animal[] {
    return [new Rhino(), new Elephant(), new Snake()];
}

這個例子裡,最佳通用型別有4個候選者:AnimalRhinoElephantSnake。 當然, Animal會被做為最佳通用型別。

這句話的表示了上下文歸類會在哪裡使用到。例子中return表示式的上下文型別就是Animal[ ],根據文件所說的上下文型別會成為最佳通用型別候選型別,所以有4個候選者,當然Animal是最佳通用型別,畢竟其餘三個型別都是Animal的派生類

4.函式引數雙向協變

當比較函式引數型別時,只有當源函式引數能夠賦值給目標函式或者反過來時才能賦值成功。 這是不穩定的,因為呼叫者可能傳入了一個具有更精確型別資訊的函式,但是呼叫這個傳入的函式的時候卻使用了不是那麼精確的型別資訊。 實際上,這極少會發生錯誤,並且能夠實現很多JavaScript裡的常見模式。

這句話想表達一個精確的型別資訊賦值給一個不精確的型別時就會發生協變。協變在c#和java等oop語言中有描述,大概的作用就是父類和子類保持相同的變化。不穩定的原因就是雖然比較函式型別只有當源函式引數賦值給目標函式或者反過來才能賦值成功,但是由於有了協變,有可能不是我們需要的引數,當然實際上很少會發生錯誤,而且能實現很多常見的模式。

5.子型別和相容

目前為止,我們使用了相容性,它在語言規範裡沒有定義。 在TypeScript裡,有兩種型別的相容性:子型別與賦值。 它們的不同點在於,賦值擴充套件了子型別相容,允許給 any賦值或從any取值和允許數字賦值給列舉型別或列舉型別賦值給數字。語言裡的不同地方分別使用了它們之中的機制。 實際上,型別相容性是由賦值相容性來控制的,即使在implementsextends語句也不例外。 更多資訊,請參閱 TypeScript語言規範.