簡體   English   中英

用於處理數據庫架構默認值的 Typescript 實用程序類型

[英]Typescript Utility type to handle database schema defaults

我正在尋找一種方法來為數據庫模式鍵入默認值和虛擬值(也就是從其他值自動生成)值。 這個想法是使用實​​用程序類型來自動轉換模式以進行插入(不需要具有默認值或由虛擬生成的道具),另一方面作為查詢結果(例如,我們確定這些字段將由默認值或其他NonNullable “虛擬”的設置,以便將它們標記為NonNullable )。

因此,如果我們將類型簡化為單個 prop:

type WithDefault<T> = T;
// Mark prop as optional
type Input<T> = T extends WithDefault<infer T> ? T | undefined : T;

一個明顯的問題是 Input<WithDefault> 和 Input 之間沒有區別。 有什么想法可以幫助實現這樣的模式嗎? 以如下模式結束:

type User = {
  firstName: string
  lastName: string
  fullName: WithDefault<string>
}

並且能夠在可插入模式和可讀模式之間來回切換。

問題 - 正如你所說 - 是類型在結構上是等效的,所以 TS 對待它們是一樣的。

你可以用一些帶有 type never 的屬性來標記它,以區分兩者。 缺點是您添加了一個不需要存在的屬性,但是您可以通過使用 Symbol 來緩解這種情況,因為它保證是唯一的。

下面的代碼(TS 游樂場鏈接在這里):

const __hasDefault = Symbol('__hasDefault');

type WithDefault<T> = T & { [__hasDefault]: never }

type User = {
  firstName: string
  lastName: string
  fullName: WithDefault<string>
}

type ConvertSchema<S extends object> = {
  [key in keyof S]: S[key] extends WithDefault<infer T> ? T | undefined : S[key];
}

type result = ConvertSchema<User>;

這為您提供了以下結果 - 這是您要找的嗎?

在此處輸入圖片說明

暫無
暫無

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

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