如何根据TypeScript接口内其他属性值定义必填属性?
实现条件必填的TypeScript类型定义需求
需求描述
当PadOperator类型的operator属性值为'CUSTOM_CHAR_LEFT'或'CUSTOM_CHAR_RIGHT'时,customSymbol属性需设为必填项;其余operator值下,customSymbol为可选(或无需提供)。
现有代码
export type PadOperator = | 'CUSTOM_CHAR_LEFT' | 'CUSTOM_CHAR_RIGHT' | 'NONE' | 'SPACE_CHAR_LEFT' | 'SPACE_CHAR_RIGHT' | 'ZERO_CHAR_LEFT' | 'ZERO_CHAR_RIGHT' ; interface PadOption { operator: PadOperator; customSymbol: string }
尝试的错误代码
interface PadOption { operator: PadOperator; customSymbol: PadOperator extends ('CUSTOM_CHAR_LEFT' | 'CUSTOM_CHAR_RIGHT') ? string | undefined; }
正确实现方案
要实现这种基于属性值的条件必填约束,需要使用TypeScript的可辨识联合类型(Discriminated Union),将PadOption拆分为两个互斥的类型分支:
export type PadOperator = | 'CUSTOM_CHAR_LEFT' | 'CUSTOM_CHAR_RIGHT' | 'NONE' | 'SPACE_CHAR_LEFT' | 'SPACE_CHAR_RIGHT' | 'ZERO_CHAR_LEFT' | 'ZERO_CHAR_RIGHT' ; type PadOption = // 自定义字符场景:customSymbol 必填 { operator: 'CUSTOM_CHAR_LEFT' | 'CUSTOM_CHAR_RIGHT'; customSymbol: string; } // 其他场景:customSymbol 可选(若不需要该属性可直接删除此字段) | { operator: Exclude<PadOperator, 'CUSTOM_CHAR_LEFT' | 'CUSTOM_CHAR_RIGHT'>; customSymbol?: string; };
方案说明
- 第一个分支专门匹配需要自定义字符的
operator值,强制customSymbol为必填字符串; - 第二个分支用
Exclude工具类型排除需要自定义字符的operator值,此时customSymbol设为可选; - 这种写法能让TypeScript根据
operator的具体值,自动推断customSymbol的必填性,在编译阶段完成约束检查。
内容的提问来源于stack exchange,提问作者BR75
相关产品推荐
相关产品推荐

