函数重载中的返回类型签名无用吗?

时间:2014-09-10 10:02:07

标签: typescript

Typescript中的函数重载具有意外行为。

看一下函数重载example,返回值签名是函数重载的一部分。但是,返回类型似乎完全被忽略了。 Typescript没有必要“选择”正确的函数参数签名,最困扰我的是,它不用于检查正确的返回值。

如果卡的返回值从数字更改为字符串,则Typescript不会发出任何警告。

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") {
    var pickedCard = Math.floor(Math.random() * x.length);
    return pickedCard;
  }
  // Otherwise just let them pick the card
  else if (typeof x == "number") {
    var pickedSuit = Math.floor(x / 13);
    return { suit: suits[pickedSuit], card: x % 13 }; // <-- change to card: '13'
  }
}

我的问题是:我是否正确解释了过载机制,所以提供不必要的返回值签名或者这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

当我调用你的函数时,我会返回以下类型:

// a is number
var a = pickCard([{ suit: 'hearts', card: 1 }]);

// b is {suit: string; card: number; }
var b = pickCard(1);

这使我不必手动指定它:

// a is number
var a: number = pickCard([{ suit: 'hearts', card: 1 }]);

// b is {suit: string; card: number; }
var b: {suit: string; card: number; } = pickCard(1);

如果你以错误的方式解决问题&#34;你确实会得到关于这些类型的错误:

// a is number
var a: {suit: string; card: number; } = pickCard([{ suit: 'hearts', card: 1 }]);

// b is {suit: string; card: number; }
var b: number = pickCard(1);

因此,根据您传递的参数确实选择了重载 - 并根据所选的重载调整返回类型。

View this example on the TypeScript Playground

相关问题