typescript - 用于处理数据库模式默认值的 Typescript 实用程序类型
问题描述
我正在寻找一种方法来为数据库模式键入默认值和虚拟值(也就是从其他值自动生成)。这个想法是使用实用程序类型自动转换模式以进行插入(不需要具有默认值的道具或由虚拟生成的道具),另一方面作为查询结果(例如,我们确信这些字段将由默认值或其他类似“虚拟”的设置,因此可以将它们标记为NonNullable
)。
如果我们将类型简化为单个道具,那么类似的事情:
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 对待它们是一样的。
您可以使用某些类型的属性对其进行标记,从不区分两者。缺点是您添加了一个不需要存在的属性,但是您可以通过使用 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>;
这给了你以下结果——这就是你要找的吗?
推荐阅读
- remote-debugging - virt manager 中的直接内核引导选项
- tensorflow - “使用 TensorFlow 后端”。这是一个错误吗?
- python - 在 Pandas 中连接两个 groupby 数据框时出错
- amazon-web-services - 保护 AWS S3 对象免受直接 url 访问
- sql-server - SQL Server:当 Else 为 case 时,在 CASE 子句中默认显示为 0
- java - 在 sql、事务和数据库文件锁定中搜索
- java - Euler059:如何从解密的可能性中选择有效的消息?
- python - 如何仅在使用 Python 找到某种模式后才能读取 csv 文件?
- visual-studio - 如何修复 jni.h 抛出“stdio.h 找不到文件错误”
- python - 用按钮临时替换整个 GUI?