You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:05:24