You need to enable JavaScript to run this app. Typescript如何合并两个带type区分的interface并实现属性互斥校验?
优惠活动
大模型
产品
解决方案
定价
更多

Typescript如何合并两个带type区分的interface并实现属性互斥校验?

解决方案

你需要使用 TypeScript 的**可辨识联合(Discriminated Union)**类型实现这个需求,type 字段就是这个联合类型的「可辨识标签」,TypeScript 会根据你传入的 type 值自动推导当前允许使用的属性,同时会禁止出现不符合当前类型的额外属性。

完整实现代码

interface LanguageSet {
    type: 'CHANGE_LANGUAGE'
    language: 'ko-KR' | 'en-US'
}

interface TitleSet {
    type: 'CHANGE_TITLE'
    title: string
}

// 合并为联合类型即可满足要求
type UpdateAction = LanguageSet | TitleSet

效果验证

直接赋值时 TypeScript 会自动做属性校验:

// 合法:type 匹配对应属性
const action1: UpdateAction = {
    type: 'CHANGE_LANGUAGE',
    language: 'en-US'
}

// 合法:type 匹配对应属性
const action2: UpdateAction = {
    type: 'CHANGE_TITLE',
    title: '首页'
}

// 报错:type 为 CHANGE_LANGUAGE 时不允许出现 title 属性
const action3: UpdateAction = {
    type: 'CHANGE_LANGUAGE',
    language: 'ko-KR',
    title: '测试' // TS 会在此处抛出错误
}

// 报错:type 为 CHANGE_TITLE 时不允许出现 language 属性
const action4: UpdateAction = {
    type: 'CHANGE_TITLE',
    title: '测试',
    language: 'en-US' // TS 会在此处抛出错误
}

在分支逻辑中使用时也可以自动做类型收窄:

function handleAction(action: UpdateAction) {
    switch(action.type) {
        case 'CHANGE_LANGUAGE':
            // 此处可安全访问 action.language,访问 action.title 会直接报错
            console.log(action.language)
            break
        case 'CHANGE_TITLE':
            // 此处可安全访问 action.title,访问 action.language 会直接报错
            console.log(action.title)
            break
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 21:24:00