如何在pgtyped中实现JSON数组包含动态值的行查询?
我之前也踩过pgtyped处理JSONB包含查询的坑,尤其是动态参数这块,官方文档确实没讲太细,很容易出现参数类型被推断成never的情况。结合你的需求,给你两个靠谱的解决方案:
方案1:显式指定参数为JSONB类型
你原来的写法没有告诉pgtyped参数的具体SQL类型,导致它没法正确推断TS类型。只需要在参数后面加上::jsonb显式转换,就能让pgtyped识别出参数类型:
SELECT * FROM my_table WHERE my_col->'my_field' @> :dyn_val::jsonb!;
这样生成的TypeScript函数参数就会是{ dyn_val: unknown }(或者更具体的JSON类型,取决于你的pgtyped版本),而不是never。调用的时候直接传JSON格式的值就行,比如:
// 如果你要传单个元素的数组 const result = await yourQueryFunction({ dyn_val: ['awesome value'] }); // 或者传JSON字符串也可以,pgtyped会自动处理 const result = await yourQueryFunction({ dyn_val: '["awesome value"]' });
方案2:用jsonb_build_array构造查询数组
如果你的需求是检查JSON数组是否包含某个单个值,可以用PostgreSQL的jsonb_build_array函数来动态构造匹配的JSON数组,这种方式更安全,避免手动拼接JSON的潜在错误:
SELECT * FROM my_table WHERE my_col->'my_field' @> jsonb_build_array(:dyn_val!);
这个写法里,dyn_val就是你要检查的单个值(比如字符串"awesome value"),jsonb_build_array会把它包装成JSON数组,刚好匹配@>操作符的要求。pgtyped能自动推断dyn_val的类型(比如如果是字符串,生成的TS参数就是string类型),完全不会出现never的问题。
为什么原来的写法不行?
pgtyped的类型推断依赖于明确的SQL类型信息,你原来的写法里,dyn_val没有任何类型标注,pgtyped没法判断它是字符串、JSON还是其他类型,所以只能生成never类型的参数。只要给参数加上明确的SQL类型提示(比如::jsonb),或者用SQL函数帮它推导类型,就能解决这个问题。
内容来源于stack exchange

