#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, могут помочь ключи . Однако я этим не пользовался, поэтому не уверен, каковы ограничения.