Generated Types
Each column in a schema has a TypeScript type for type-safe select, insert, and update queries with Kysely.
Types for a schema can be retrieved using the infer method on the schema.
Consider the following table definition:
const users = table({
columns: {
id: integer().generatedAlwaysAsIdentity(),
name: text(),
createdAt: timestampWithTimeZone().default(sql`now`).notNull(),
},
constraints: {
primaryKey: primaryKey(["id"]),
},
});When we infer the types with:
type DB = typeof dbSchema.infer;The DB type will be:
type DB = {
users: {
id: {
readonly __select__: number;
readonly __insert__: never;
readonly __update__: never;
};
name: {
readonly __select__: string;
readonly __insert__: string | null | undefined;
readonly __update__: string | null;
},
createdAt: {
readonly __select__: Date;
readonly __insert__: Date | undefined;
readonly __update__: Date;
},
};
};The types are inferred according to the column data types, constraints, default values and if the column is generated.
Column data types
Here's a table for select, insert, and update types for each column type:
| Column | Select | Insert | Update |
|---|---|---|---|
| bigint | string | bigint | number | string | bigint | number | string |
| bigserial | string | bigint | number | string | bigint | number | string |
| bit | string | string | string |
| bitVarying | string | string | string |
| boolean | boolean | boolean | Boolish* | boolean | Boolish* |
| bytea | Buffer | Buffer | string | Buffer | string |
| characterVarying | string | string | string |
| character | string | string | string |
| cidr | string | string | string |
| date | Date | Date | string | Date | string |
| doublePrecision | string | bigint | number | string | bigint | number | string |
| enumerated | enum values | enum values | enum values |
| inet | string | string | string |
| integer | number | number | string | number | string |
| json | JsonValue* | JsonValue* | JsonValue* |
| jsonb | JsonValue* | JsonValue* | JsonValue* |
| macaddr | string | string | string |
| macaddr8 | string | string | string |
| numeric | string | bigint | number | string | bigint | number | string |
| real | number | bigint | number | string | bigint | number | string |
| serial | number | number | string | number | string |
| smallint | number | number | string | number | string |
| time | string | string | string |
| timeWithTimeZone | string | string | string |
| timestamp | Date | Date | string | Date | string |
| timestampWithTimeZone | Date | Date | string | Date | string |
| tsquery | string | string | string |
| tsvector | string | string | string |
| uuid | string | string | string |
| xml | string | string | string |
(*) Boolish and JsonValue are defined as follows:
type Boolish = "true" | "false" | "yes" | "no" | 1 | 0 | "1" | "0" | "on" | "off";
type JsonArray = JsonValue[];
type JsonValue = boolean | number | string | Record<string, unknown> | JsonArray;Optionality and nullability
By default, columns have:
- Nullable selects, inserts and updates.
- Optional inserts and updates.
Columns will have their optionality and nullability changed accordingly to the constraints they have, their default data value, and if they are generated:
| Column | Optional | Nullable |
|---|---|---|
| with default data value | yes | yes |
with NOT NULL constraint | no | no |
with NOT NULL constraint with default data value | yes | no |
serial | yes | no |
bigserial | yes | no |
| generated by default as identity | yes | no |
| primary key | no | no |
serial, bigserial generated by default as identity primary key | yes | no |
Examples
Type of an integer column named id:
type id = {
readonly __select__: number | null;
readonly __insert__: number | string | null | undefined;
readonly __update__: number | string | null;
};Generated always as identity will not accept inserts or updates:
type id = {
readonly __select__: number;
readonly __insert__: never;
readonly __update__: never;
};Type of an integer column with a NOT NULL constraint:
type id = {
readonly __select__: number;
readonly __insert__: number | string;
readonly __update__: number | string;
};Type of an integer column with a default data value and a NOT NULL constraint:
type id = {
readonly __select__: number;
readonly __insert__: number | string | undefined;
readonly __update__: number | string;
};Type of an bigint column generated by default as identity:
type id = {
readonly __select__: string;
readonly __insert__: bigint | number | string | undefined;
readonly __update__: bigint | number | string;
};