Prismaスキーマとフィールドの型
Accellaではスキーマ定義にPrismaを利用していますが、各機能のサポート状況は以下の通りです。
| 機能 | 記法 | サポート | 
|---|---|---|
| ID | @id | ✅ | 
| Multi-field ID (Composite ID) | @@id | ✅ | 
| Table name mapping | @@map | ✅ | 
| Column name mapping | @map | ✅ | 
| Default value | @default | ✅ | 
| Updated at | @updatedAt | ✅ | 
| List | [] | ✅ | 
| Optional | ? | ✅ | 
| Relation field | ✅ | |
| Implicit many-to-many relations | ✅ | |
| Enums | enum | ✅ | 
| Unsupported type | Unsupported | - | 
フィールドタイプが必須の場合とオプションの場合で、NewModelとPersistedModelの型が異なります。
| type | NewModel | PersistedModel | 
|---|---|---|
| Required Field | Nullable | NonNullable | 
| Optional Field | Nullable | Nullable | 
また、デフォルト値の指定方法によってもNewModelとPersistedModelの型が異なります。
| arg | NewModel | PersistedModel | 
|---|---|---|
| static value | NonNullable | NonNullable | 
| autoincrement() | Nullable | NonNullable | 
| now() | Nullable | NonNullable | 
| dbgenerated() | Nullable | NonNullable | 
| uuid() | NonNullable | NonNullable | 
| cuid() | NonNullable | NonNullable | 
以下に、モデル定義とそれに対応するNewModelとPersistedModelの例を示します。
model Sample {  id         Int      @id @default(autoincrement())  required   Int  optional   String?  hasDefault Boolean  @default(false)  createdAt  DateTime @default(now())  updatedAt  DateTime @updatedAt  uuid       String   @default(uuid())  cuid       String   @default(cuid())}// NewModelinterface NewSample {  id: number | undefined;  required: number | undefined;  optional: string | undefined;  hasDefault: boolean;  createdAt: Date | undefined;  updatedAt: Date | undefined;  uuid: string;  cuid: string;}
// PersistedModelinterface Sample {  id: number;  required: number;  optional: string | undefined;  hasDefault: boolean;  createdAt: Date;  updatedAt: Date;  uuid: string;  cuid: string;}Jsonフィールドの型
通常PrismaスキーマでJson型を定義する場合、厳密な型を指定できません。
model Sample {  id   Int  @id @default(autoincrement())  data Json // Jsonフィールドには厳密な型がありません}Accel RecordではBaseModelにおいてJson型のフィールドに対して型を指定することができます。 
この場合は、Json型のフィールドも読み書きともに型安全に扱うことができます。
import { ApplicationRecord } from "./applicationRecord.js";
export class SampleModel extends ApplicationRecord {  // BaseModel上でJson型のフィールドに対して型を指定できる  data: { myKey1: string; myKey2: number } | undefined = undefined;}import { Sample } from "./models/index.js";
const sample = Sample.build({});
// OKsample.data = { myKey1: "value1", myKey2: 123 };
// Type Error !sample.data = { foo: "value1" };// => Type '{ foo: string; }' is not assignable to type '{ myKey1: string; myKey2: number; } | undefined'.
// OKconsole.log(sample.data?.myKey1);
// Type Error !console.log(sample.data?.foo);// => Property 'foo' does not exist on type '{ myKey1: string; myKey2: number; } | undefined'.