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

扩展接口联合类型访问报错:无法读取独有属性

解决TypeScript联合类型访问独有属性报错问题

问题核心:当payload是IRefundPayload | IDuplicatePayload联合类型时,TypeScript仅允许访问两个类型共有的属性,comment是IRefundPayload独有的,直接访问会触发类型检查报错。

以下是三种可行的解决办法:

1. 使用in操作符做类型窄化

通过判断属性是否存在,让TypeScript自动推断当前payload的具体类型:

const Footer = ({ payload }: IFooterProps) => {
    if ('comment' in payload) {
        // 此时TypeScript自动推断payload为IRefundPayload,可安全访问comment
        console.log(payload.comment);
    } else {
        // 自动推断为IDuplicatePayload,可访问notes
        console.log(payload.notes);
    }
}

2. 自定义类型守卫函数

如果需要更清晰的逻辑判断,可以写一个自定义函数明确类型:

// 自定义类型守卫,返回值`payload is IRefundPayload`是类型推断的关键
function isRefundPayload(payload: IRefundPayload | IDuplicatePayload): payload is IRefundPayload {
    return (payload as IRefundPayload).comment !== undefined;
}

const Footer = ({ payload }: IFooterProps) => {
    if (isRefundPayload(payload)) {
        console.log(payload.comment);
    } else {
        console.log(payload.notes);
    }
}

3. 添加区分字段(推荐)

给两个接口添加唯一的区分字段(Discriminated Union),这是TypeScript处理联合类型最规范的方式:

// 修改接口,添加type区分字段
interface IDefaultPayload {
    orderTokenValue: string;
    items: IActionLineItem;
}

export interface IRefundPayload extends IDefaultPayload {
    type: 'refund';
    isFullShipmentRefund: boolean;
    comment: string;
}

export interface IDuplicatePayload extends IDefaultPayload {
    type: 'duplicate';
    notes: string;
}

// 组件中通过switch判断类型
const Footer = ({ payload }: IFooterProps) => {
    switch (payload.type) {
        case 'refund':
            console.log(payload.comment);
            break;
        case 'duplicate':
            console.log(payload.notes);
            break;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:50:23