Typescript 函数重载中的返回类型签名是否无用?

Typescript 函数重载中的返回类型签名是否无用?,typescript,Typescript,Typescript中的函数重载具有意外行为 看看函数重载,返回值签名是函数重载的一部分。但是,返回类型似乎被完全忽略。Typescript没有必要“选择”正确的函数参数签名,最让我困扰的是,它不用于检查正确的返回值 如果卡片的返回值从数字更改为字符串,Typescript不会给出任何警告 function pickCard(x: {suit: string; card: number; }[]): number; function pickCard(x: number): {suit: str

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

看看函数重载,返回值签名是函数重载的一部分。但是,返回类型似乎被完全忽略。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'
  }
}
函数pickCard(x:{suit:string;card:number;}[]):number;
函数pickCard(x:number):{suit:string;card:number;};
功能选取卡(x):任意{
//检查是否正在使用对象/数组
//如果是这样的话,他们给了我们一副牌,我们来选牌
如果(x的类型==“对象”){
var pickedCard=Math.floor(Math.random()*x.length);
回执卡;
}
//否则就让他们选牌吧
else if(x的类型=“编号”){
var pickedSuit=数学楼层(x/13);

return{suit:suits[pickedSuit],card:x%13};//调用函数时,返回以下类型:

// 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);
如果你让他们“走错了路”,你确实会得到关于类型的错误:

// 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);
因此,重载确实是根据您传递的参数选择的,并且返回类型是根据所选重载进行调整的


.

当使用“15”(字符串)而不是15(数字)调用pickcard时,是否至少在调用方端检查了它?(如果调用第一个重载,当您将结果视为数字以外的内容时,它是否会发出咯咯声?)它确实会抱怨。如果
return pickedCard
更改为
return'someString'
它不会抱怨。不,我的意思是,调用方是否根据选择正确的重载对返回值进行了正确的类型推断?根据@SteveFenton的回答,确实如此。因此,您在这方面有一些价值,即使它不是完全没有ypecheck函数的实现,它会检查调用代码。是的,@SteveFenton的回答显示了正确的行为,我现在有点明白Typescript是在检查类型而不是值。我确实得到了你想要的。在一个完美的世界中,它还应该检查实现的返回值以匹配这里正在使用。事实上,不必将整个
if(typeof)
内容放入单独的重载中。毕竟,您的实现可能会忘记一个案例。但如果pickCard返回的不是一个数字而是一个字符串(例如,由于编程错误),这可能要求太高了,Typescript不会抱怨。(参见示例).
a
将是
notANumber
而不是2。@donut。但这将是函数实现中的一个编程错误。您确实会对调用函数的代码进行类型检查。至少是这样。您是对的。我太傻了,忘了Typescript是编译时类型检查,而不是运行时。如果也能捕捉到这样的编程错误就好了。重载的问题是TypeScript只会根据实现签名检查返回类型(在提供的示例中是
any
)。实现签名需要有一个与所有指定返回类型兼容的返回类型。