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
相关产品推荐
相关产品推荐

