Параллельное использование моделей prisma и typescript

#typescript #prisma

Вопрос:

Я часто использую утверждения const в своих моделях машинописи:

 const ListingVehicleTypes = [
  "car",
  "motorcycle",
  "caravan",
  "camper_trailer"
] as const;

interface LISTING {
  vehicleType: typeof ListingVehicleTypes[number];
  ...
}
 

Как таковой, LISTING["vehicleType"] правильно выводится как "car" | "motorcycle" | "caravan" | "camper_trailer" .

Могу ли я выразить такие ограничения в своем schema.prisma ? Ни импорт, ни служебные функции typescript в *.prisma файлах не разрешены:

 model Listing {
    vehicleType   typeof ListingVehicleTypes[number]  // no-go
}
 

Если нет, то есть ли способ «обогатить» модели prisma более безопасными для типов моделями машинописи при выполнении запросов к базе данных на базе prisma?

Я всегда могу привести тела запросов и ответы any , но есть ли более чистый подход?

Как бы то ни было, я использую mongodb провайдера, но я не думаю, что провайдер играет здесь какую-то роль.

Ответ №1:

Я предлагаю использовать для этого перечисление. Но обязательно проверьте, поддерживаются ли перечисления в базовой базе данных отсюда.

В схеме Призмы,

 
model Listing {
  vehicleType  VehicleType @default(car)
}

enum VehicleType {
  car
  motorcycle
  caravan
  camper_trailer
}

 

Затем в своем коде машинописи вы можете использовать это следующим образом.

 import { Listing } from "@prisma/client";

type VehicleTypes = Listing["vehicleType"];

 

Комментарии:

1. Это шаг в правильном направлении, спасибо! Однако type VehicleTypes заключается только в том, что … а type . И я использую утверждения const для сохранения повторяемых свойств массивов за пределами моих объявлений типов (особенно при создании интерфейса или при проверке с помощью схемы yup ). Другими словами, я не могу повторять типы, созданные prisma- Object.keys(Listing['vehicleType']) конечно 'Listing' only refers to a type, but is being used as a value here. , я полагаю, что на этом связь между моделями prisma и ts заканчивается.

2. Если вам нужно получить итерируемый массив из типа ts-transformer, могут помочь ключи . Однако я этим не пользовался, поэтому не уверен, каковы ограничения.