gpt4 book ai didi

typescript - 函数重载中的返回类型签名没用吗?

转载 作者:行者123 更新时间:2023-12-04 14:33:41 24 4
gpt4 key购买 nike

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

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

最佳答案

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

// 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);

所以重载确实是根据您传递的参数选择的 - 并且返回类型是根据所选重载调整的。

View this example on the TypeScript Playground .

关于typescript - 函数重载中的返回类型签名没用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25762556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com