postgres
postgres copied to clipboard
What would be the right type to pass an object?
Hello,
in my table "account" the column "contact" is of the type jsonb. Using the following interface, I get an TS Error:
error: TS2769 [ERROR]: No overload matches this call. Overload 1 of 2, '(first: TemplateStringsArray, ...rest: never): PendingQuery<Row[]>', gave the following error. Argument of type 'string' is not assignable to parameter of type 'never'. Overload 2 of 2, '(template: TemplateStringsArray, ...parameters: readonly ParameterOrFragment
[]): PendingQuery<Row[]>', gave the following error. Argument of type 'object' is not assignable to parameter of type 'ParameterOrFragment '. return await sql`
I have two questions:
- Is it correct to pass an object like this for
jsonb? - If yes, what could I do to avoid the TS error?
Thank you very much!
interface AccountData {
owner: string;
email: string;
contact: object;
password: string;
}
async function insertAccount(
{ owner, email, contact, password }: AccountData,
) {
return await sql`
INSERT INTO public.account (owner, email, contact, hashed_password)
VALUES (${owner}, ${email}, ${contact}, crypt(${password}, gen_salt('md5')))
`;
}
const dataJane = {
owner: "Jane Doe",
email: "[email protected]",
contact: { "phone": "12345" },
password: "password123",
};
await insertAccount(dataJane);
The query looks just right, and your object will be inserted correctly as jsonb.
Now for the typescript error, I don't know, and can't help since I don't use it :)
If yes, what could I do to avoid the TS error?
Try casting contact to SerializableParameter<object> (see the type declaration, mind the never default). Like this:
…
return await sql`
INSERT INTO public.account (owner, email, contact, hashed_password)
VALUES (${owner}, ${email}, ${contact as SerializableParameter<object>}, crypt(${password}, gen_salt('md5')))
`;
…
Is still throwing unfortunately:
async function insertRow(table: Table, input: any) {
return table === "account"
? await sql`
INSERT INTO ${sql(table)} (owner, email, contact, hashed_password)
VALUES (${input.owner}, ${input.email}, ${input
.contact as postgres.SerializableParameter<
object
>}, crypt(${input.password}, gen_salt('md5')))
RETURNING *`
: await sql`
INSERT INTO ${sql(table)} ${sql(input)}
RETURNING *`;
}
error: TS2769 [ERROR]: No overload matches this call. Argument of type '[Helper<"account", []>, any, any, SerializableParameter
I have the same problem and this works for me
import { SerializableParameter } from 'https://deno.land/x/[email protected]/types/index.d.ts';
// fields of cache table
// key: text
// data: jsonb
async function add(key: string, data: unknown): Promise<boolean> {
await this.sql`INSERT INTO cache ("key", "data") VALUES (${key}, ${data as SerializableParameter})`;
// ... ...
}