Working with TypeScript Types

1. Using Generated Model Types

import type { User, Post } from "@prisma/client";
function greet(u: User) { return `Hi, ${u.name ?? "friend"}`; }
TypeDetail
UserAll scalar fields of the model
RelationsNot included by default

2. Creating Custom Payload Types

import type { Prisma } from "@prisma/client";
type UserWithPosts = Prisma.UserGetPayload<{ include: { posts: true } }>;
HelperUse
Prisma.<Model>GetPayload<T>Compute query result type
ValidatorPrisma.validator<Prisma.UserDefaultArgs>()(args)

3. Using Type Helpers

TypeUse
Prisma.UserCreateInputShape for create
Prisma.UserUpdateInputShape for update
Prisma.UserWhereInputShape for filters
Prisma.UserSelectAllowed select keys

4. Implementing Type Guards

function isAdmin(u: User): u is User & { role: "ADMIN" } {
  return u.role === "ADMIN";
}
PatternUse
PredicateNarrow union types
DiscriminatorCombine with literal types

5. Using Partial Types

HelperUse
Partial<User>All fields optional
Pick<User, "id" | "email">Subset
Omit<User, "password">Exclude fields

6. Creating Union Types

type Identifier = { id: number } | { email: string };
UseDetail
Polymorphic IDsfindBy either id or email
Result variants{ kind: "ok" } | { kind: "err" }

7. Using Utility Types

UtilityDetail
Required<T>All fields required
Readonly<T>Immutable
Awaited<T>Resolve Promise type

8. Typing Raw Query Results

APIDetail
$queryRaw<T>Generic return type
Prisma.sqlSafe composition

9. Implementing Generic Functions

async function findById<K extends keyof typeof prisma>(
  model: K, id: number
) {
  return (prisma[model] as any).findUnique({ where: { id } });
}
Trade-offDetail
ReusabilityOne helper for all models
Type safetyLoses inference; consider per-model

10. Configuring Strict Null Checks

{ "compilerOptions": { "strict": true, "strictNullChecks": true } }
SettingEffect
strictEnables all strict checks
strictNullChecksTreat null/undefined distinctly