TypeScript如何根据属性值将另一关联属性设为必填类型?
TypeScript 条件必填属性实现方案
完全可以实现你要的效果,核心是使用可辨识联合类型做属性约束,以下是具体实现:
基础实现
直接拆分两种校验状态的类型结构做联合:
type TextInput = // isValid 为 true 时,validMessage 必须传 { isValid: true; validMessage: string; } // isValid 为 false 或者不传时,validMessage 可选 | { isValid?: false; validMessage?: string; }
效果验证
你可以直接测试以下用例看约束是否生效:
// ✅ 合法:isValid 为 true 时传递了 validMessage const validInput: TextInput = { isValid: true, validMessage: "格式校验通过" } // ❌ 报错:isValid 为 true 时缺少必填的 validMessage const errorInput: TextInput = { isValid: true } // ✅ 合法:isValid 为 false,不需要传 validMessage const invalidInput: TextInput = { isValid: false } // ✅ 合法:不传递 isValid,validMessage 无强制要求 const emptyInput: TextInput = {}
带公共属性的扩展写法
如果类型还有其他公共属性,可以把公共部分抽离再做交叉,便于维护:
// 抽离所有场景下都存在的公共属性 type BaseInput = { value: string; placeholder?: string; disabled?: boolean; } type ValidState = BaseInput & { isValid: true; validMessage: string; } type InvalidState = BaseInput & { isValid?: false; validMessage?: string; } type TextInput = ValidState | InvalidState
实现原理是TS会把isValid作为联合类型的判别字段,根据它的取值自动匹配对应的类型分支,从而实现不同场景下的属性必填约束。
内容的提问来源于stack exchange,提问作者Aessandro
相关产品推荐
相关产品推荐

