【发布时间】:2014-11-03 22:24:03
【问题描述】:
Typescript 中的函数重载有意外行为。
看看函数重载example,返回值签名是函数重载的一部分。但是,返回类型似乎被完全忽略了。 Typescript 没有必要“选择”正确的函数参数签名,最困扰我的是,它不用于检查正确的返回值。
如果card的返回值从数字变为字符串,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'
}
}
我的问题是:我是否正确解释了重载机制,那么提供返回值签名是不是必要的,或者这是一个错误?
【问题讨论】:
-
是否至少在调用方进行了检查? (如果你调用第一个重载,当你将结果视为数字以外的东西时它会发出嘶哑的声音吗?)
-
当使用 '15'(字符串)而不是 15(数字)调用 pickcard 时,它确实会抱怨。如果
return pickedCard更改为return 'someString'它不会抱怨。 -
不,我的意思是,调用方是否会根据选择正确的重载对返回值进行正确的类型推断?根据@SteveFenton 的回答,确实如此。所以你有一些价值,即使它没有完全检查函数的实现,它也会检查调用代码。
-
是的,@SteveFenton 的回答显示了正确的行为,我现在有点明白 Typescript 正在检查类型而不是值。
-
我确实得到了你想要的。在一个完美的世界中,它还应该检查实现的返回值以匹配这里使用的重载。事实上,没有必要拥有整个
if (typeof)东西,它应该进入单独的重载。毕竟,您的实现可能会忘记一种情况。但这可能要求太多......
标签: typescript