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

如何为TypeScript中两个相似类型编写兼容的处理函数?

解决TypeScript联合类型返回值不匹配问题

你的问题出在addSuffix函数返回的是First | Second联合类型,TypeScript无法确定返回的具体是哪一个类型,所以当doA尝试将其作为First返回时,编译器会报错——因为联合类型里可能包含缺少address属性的Second。

在TypeScript里,你可以用泛型函数结合类型约束来解决这个问题,既贴合OOP中接口实现的思路,又能保证类型安全:

方案1:直接用泛型约束公共属性

修改addSuffix为泛型函数,约束泛型参数必须包含name属性:

type First = {
    name: string,
    address: string,  
}

type Second = {
    name: string,
    email: string,
}

// 泛型函数,T约束为包含name属性的类型
function addSuffix<T extends { name: string }>(payload: T): T {
    payload.name += "suffix";
    return payload;
}

const a: First = {
    "name": "John",
    "address": "London",
}

const b: Second = {
    "name": "Alice",
    "email": "alice@alice.com"
}

function doA(payload: First): First {
    // some operations
    return addSuffix(payload); // 现在返回的是First类型,无报错
}

function doB(payload: Second): Second {
    // some operations
    return addSuffix(payload); // 返回的是Second类型,无报错
}

doA(a);
doB(b);

方案2:定义公共接口(更贴近OOP接口实现思路)

先定义一个包含name属性的公共接口,让First和Second都兼容这个接口,再用泛型约束到该接口:

// 定义公共接口,对应OOP中的基接口
interface HasName {
    name: string;
}

type First = HasName & {
    address: string,  
}

type Second = HasName & {
    email: string,
}

// 泛型约束到HasName接口
function addSuffix<T extends HasName>(payload: T): T {
    payload.name += "suffix";
    return payload;
}

// 后续代码和之前一致,doA、doB返回值类型匹配,无报错

这两种方案都能让addSuffix保留传入参数的具体类型,而不是返回模糊的联合类型,完美解决类型不匹配的报错。

内容的提问来源于stack exchange,提问作者saydiva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:20:24