Typescript类型检查问题

翻阅官方文档,函数重载的类型检查有下面的例子:

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出来的类型应该不能通过类型检查。请教为什么?

阅读 5.1k
2 个回答

上面几个签名都是暴露给外面的,最后一个才是约束……

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的“内部”签名,而且必须与所有指定的overloads可以兼容。

之所以你将第二个重载的返回类型改成 {suit: string, card: boolean} 没有报错,是因为在第三行中,返回类型是any, 也就是可以返回任何类型,当然就不会报错了。
如果你改成 function pickCard(x): number | {suit: string, card: number}, 编译就不会通过了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题