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

TypeScript如何定义需包含两个指定键名中任意一个的对象类型

错误写法问题

你提供的写法属于索引签名的错误用法,TypeScript 中索引签名仅用来描述一类键的通用值类型,无法实现「必须包含指定联合类型中的至少一个键」的需求,本身语法也不符合 TypeScript 规范。

正确实现方式

方案1:直接联合类型(适用仅二选一的简单场景)

直接通过联合类型限定必须满足两种属性结构中的至少一种,天然支持仅传height、仅传maxHeight、同时传两种属性三种合法情况:

// 无其他样式属性的写法
type Style = { height: string | number } | { maxHeight: string | number }

// 如果你需要加入其他通用样式属性,通过交叉类型扩展即可
type Style = ({ height: string | number } | { maxHeight: string | number }) & {
  width?: string | number
  color?: string
  // 其他你需要的样式属性定义
}

方案2:通用工具类型封装(适用多场景复用)

如果需要频繁使用「至少包含指定属性中的一个」的类型约束,可以封装通用工具类型:

// 通用工具类型:要求对象至少包含T中的一个属性
type AtLeastOne<T> = {
  [K in keyof T]: Required<Pick<T, K>> & Partial<Omit<T, K>>
}[keyof T]

// 定义高度相关的属性约束
type HeightRule = {
  height: string | number
  maxHeight: string | number
}

// 最终样式类型,可交叉其他通用样式
type Style = AtLeastOne<HeightRule> & {
  // 其他通用样式属性
}

如果需要严格禁止同时传入height和maxHeight,仅允许二选一,可以调整联合类型的定义,将另一个属性显式设为never:

type Style = 
  | { height: string | number; maxHeight?: never }
  | { maxHeight: string | number; height?: never }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:24:03