在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ Typescript類型檢查問題

Typescript類型檢查問題

翻閱官方文檔,函數(shù)重載的類型檢查有下面的例子:

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 };
    }
}

let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

let pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);

嘗試將第四行
function pickCard(x: number): {suit: string, card: number};
改成
function pickCard(x: number): {suit: string, card: boolean};
為什么ts不會檢查出類型錯誤?此時pickedCard2使用了這一行重載類型,return出來的類型應該不能通過類型檢查。請教為什么?

回答
編輯回答
懶豬

Typescript 允許我們定義重載列表(overload list)。

  function pickCard(x: {suit: string, card: number }[]): number;
  function pickCard(x: number): {suit: string, card: number};
  function pickCard(x): any { }

前兩行定義了這個function的“外部”簽名,就是你在外面看到的關于這個function的描述。
第三行定了這個function的“內(nèi)部”簽名,而且必須與所有指定的overloads可以兼容。

之所以你將第二個重載的返回類型改成 {suit: string, card: boolean} 沒有報錯,是因為在第三行中,返回類型是any, 也就是可以返回任何類型,當然就不會報錯了。
如果你改成 function pickCard(x): number | {suit: string, card: number}, 編譯就不會通過了。

2017年6月3日 04:09
編輯回答
帥到炸

上面幾個簽名都是暴露給外面的,最后一個才是約束……

2018年5月30日 14:31