如何实现TypeScript中仅当指定参数为true时必填另一参数?
解决方案
要实现这种条件必填参数的逻辑,在TypeScript里有两种常用的靠谱方式,下面分别演示:
方法一:函数重载
函数重载可以明确定义不同参数组合的类型规则,完全匹配你的需求:
// 重载签名1:onlyValues 为 false 时,不需要传入 values function myFunction(allData: Array<any>, selectedItems: Array<any>, onlyValues?: false): void; // 重载签名2:onlyValues 为 true 时,必须传入 values function myFunction(allData: Array<any>, selectedItems: Array<any>, onlyValues: true, values: Array<any>): void; // 函数实现(参数类型需兼容所有重载签名) function myFunction(allData: Array<any>, selectedItems: Array<any>, onlyValues: boolean = false, values?: Array<any>) { console.log(allData); console.log(selectedItems); // 原代码里的 selectedData 是笔误,已修正 console.log(onlyValues); console.log(values); }
调用时的类型检查效果:
myFunction([], [], false)✅ 合法,无需传valuesmyFunction([], [], true)❌ TypeScript会报错,提示缺少values参数myFunction([], [], true, [1,2,3])✅ 合法
方法二:对象参数 + 联合类型
如果参数较多,把参数封装成对象会更清晰,通过联合类型约束不同场景的参数要求:
type MyFunctionParams = // onlyValues 为 false 时,values 可选 { allData: Array<any>, selectedItems: Array<any>, onlyValues?: false, values?: Array<any> } // onlyValues 为 true 时,values 必填 | { allData: Array<any>, selectedItems: Array<any>, onlyValues: true, values: Array<any> }; function myFunction(params: MyFunctionParams) { const { allData, selectedItems, onlyValues = false, values } = params; console.log(allData); console.log(selectedItems); console.log(onlyValues); console.log(values); }
调用示例:
myFunction({ allData: [], selectedItems: [], onlyValues: false })✅ 合法myFunction({ allData: [], selectedItems: [], onlyValues: true })❌ 报错,缺少valuesmyFunction({ allData: [], selectedItems: [], onlyValues: true, values: ['a','b'] })✅ 合法
两种方法都能实现需求:函数重载更贴近原函数的参数传递方式,对象参数的方式扩展性更好,后续新增参数更方便。
内容的提问来源于stack exchange,提问作者Cohchi
相关产品推荐
相关产品推荐

