TypeScript中接收不同对象接口的函数返回值类型不匹配问题
解决TypeScript函数返回类型与输入类型不匹配的问题
你的核心问题是alterAceValue函数返回Dealer | Players联合类型,TypeScript无法确定返回值的具体类型,导致给Players类型变量赋值时触发类型错误——毕竟返回值可能是缺少bank属性的Dealer。
最优解决方案:泛型约束
用泛型约束让函数返回和输入完全一致的类型,既符合DRY原则,又能保证类型安全。修改后的代码如下:
interface Dealer { hand: string[]; handValues: number[]; sum: number; } interface Players extends Dealer { bank: number; } let player1: Players = { hand: ['Ace','5','Ace'], handValues: [11, 5,11], sum: 27, bank: 900, } // 泛型函数:T约束为Dealer的子类型 const alterAceValue = <T extends Dealer>(player: T): T => { if (player.hand.includes('Ace')) { while (player.sum > 21) { const lastIndex = player.handValues.lastIndexOf(11); player.handValues[lastIndex] = 1; player.sum = player.handValues.reduce((prev, curr) => prev + curr); if (!player.handValues.includes(11)) break; } } return player; } // 现在类型匹配,无报错 player1 = alterAceValue(player1);
为什么这能解决问题
- 泛型参数
T extends Dealer限定了输入参数只能是Dealer或它的子类(比如Players),确保函数内部可以安全访问hand、handValues、sum这些共同属性。 - 返回类型设为
T,意味着函数会严格返回和输入参数完全相同的类型。当你传入Players类型的player1时,TypeScript能准确推断出返回值也是Players,自然不会再报类型不匹配的错误。 - 这种方式不需要为庄家和玩家写重复函数,避免了冗余代码,同时保持了类型系统的严谨性。
内容的提问来源于stack exchange,提问作者dmaltron87
相关产品推荐
相关产品推荐

