[英]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.