簡體   English   中英

如何細化棱柱類型

[英]How to refine prisma type

這是一個非常簡化的案例,我有更高級的案例。 我在我的架構中定義了一個“支付”模型,如下所示:

model Payment {
  id                      Int      @default(autoincrement()) @id
  covered                 Boolean?
  paid                    Boolean
  amount                  number
}

執行const payments = Payment.findMany並選擇所有屬性,這給了我們一個這樣的類型:

type Payment = {
  id: number;
  covered?: boolean;
  paid: boolean;
  amount: number;
}

但是我想告訴 Prisma findMany實際上應該在下面返回這個。 在下面,如果paidtrue ,則covered 是非空的:

type Payment = {
  id: number;
  amount: number;
} & (
  | { paid: false; covered?: never }
  | { paid: true; covered: boolean }
)

是否有可能以某種方式告訴 Prisma 這種精致的類型提示? 我在下面的代碼中嘗試了這個:

const payments = await prisma.payment.findMany(.....) as Omit<typeof payments[number], 'paid' | 'covered'> & (
  | { paid: false; covered?: never }
  | { paid: true; covered: boolean }
);

我認為你最好的選擇是使用所謂的“判別類型”,使用一個共同的財產,在你的情況下是這樣的paid財產。 這是游樂場的鏈接供您參考

interface BasePayment {
  id: number;
  paid: boolean;
  amount: number;
}

interface PaidPayment extends BasePayment {
  paid: true;
  covered: boolean;
}

interface UnpaidPayment extends BasePayment {
  paid: false;
}

const paidPayment: PaidPayment = {
  id: 1,
  amount: 10,
  covered: true,
  paid: true
};

const unpaidPayment: UnpaidPayment = {
  id: 1,
  amount: 10,
  covered: true, // This won't compile because type `UnpaidPayment` doesn't have `covered`
  paid: false
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM