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

Typescript依赖可选属性定义问题:联合类型校验失效如何解决?

方案存在的问题

TypeScript 的对象类型默认是开放结构,不会限制额外属性的存在。你定义的T接口仅要求对象必须包含a、b两个属性,对其他属性没有限制。因此当你传入{a, b, c}时,TypeScript 会判定它符合T的类型要求,自然不会抛出错误。

实现需求的方案

你需要将联合类型的分支定义为密封结构,也就是显式规定不允许存在的属性类型为never:

// 工具类型:将传入类型的所有属性转为可选 never 类型
type AllOrNothing<U> = {
  [K in keyof U]?: never
}

interface T { a: any, b: any }
interface U { c: any, d: any }

// 两种合法情况:要么完全没有 U 的属性,要么包含 U 的全部属性
type V = (T & AllOrNothing<U>) | (T & U)
验证效果
  • 合法场景:
    // 仅包含 a、b,合法
    const v1: V = { a: 1, b: 2 }
    // 同时包含 a、b、c、d,合法
    const v2: V = { a: 1, b: 2, c: 3, d: 4 }
    
  • 非法场景:
    // 仅包含 c 缺失 d,会直接抛出类型错误
    const v3: V = { a: 1, b: 2, c: 3 }
    

如果需要更通用的封装,可以进一步提取工具类型:

type AllOrNothing<U> = { [K in keyof U]?: never }
type RequiredGroup<T, G> = T & (G | AllOrNothing<G>)

// 直接使用即可
type V = RequiredGroup<T, U>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:39:00