Adonis V5 Lucid条件查询可选过滤参数TS报错非忽略解决方案问询
问题根源
这不是Lucid的类型定义Bug,是TypeScript本身的类型收窄限制:类型收窄逻辑无法穿透到回调函数作用域,即使Lucid的if方法确实只有第一个参数为真值时才会执行回调,TS也无法跨作用域推断filters下的属性已非空。
另外你当前代码存在笔误:第二个if的判断参数写的是filters.department,但你定义的ISalesFilter接口中对应字段是复数形式的departments,这个问题也会触发类型报错。
合规解法
解法1:使用if回调的第二参数(最优)
Lucid的if方法回调默认会将你传入的判断条件作为第二参数传入,该参数已经被类型收窄为非空状态,不需要额外判断:
async filterSales(filters: ISalesFilter) { const filteredSales = await FilterModel.query() .if(filters.status, (query, status) => { // status类型已被收窄为number[],无undefined风险 query.whereIn('statusId', status); }) .if(filters.departments, (query, departments) => { // departments类型已被收窄为string[] query.whereIn('departmentId', departments); }); return filteredSales; }
这个方案完全符合TS类型规范,没有多余判断,是官方推荐的写法。
解法2:使用非空断言运算符
如果你确定回调执行时对应参数一定存在,可以用非空断言运算符!标记属性非空,比@ts-ignore更安全,不会关闭整行的类型检查:
async filterSales(filters: ISalesFilter) { const filteredSales = await FilterModel.query() .if(filters.status, (query) => { query.whereIn('statusId', filters.status!); }) .if(filters.departments, (query) => { query.whereIn('departmentId', filters.departments!); }); return filteredSales; }
内容的提问来源于stack exchange,提问作者yuridamata
相关产品推荐
相关产品推荐

