[Typescript] Advance query builder example
type BaseTable = {
[colName: string]: string | number | boolean;
}
type Columns<Tables extends { [tableName: string]: BaseTable }> = {
[K in keyof Tables]: K extends string ? (keyof Tables[K] extends string ? `${K}.${keyof Tables[K]}`: never): never
}[keyof Tables]
type Flat<Tables extends {[tableName: string]: BaseTable}> = {
[K in Columns<Tables>]: Tables[K extends `${infer T}.${infer _}` ? T: never][K extends `${infer _}.${infer C}` ? C : never]
}
class QueryBuilder<Tables extends { [tableName: string]: BaseTable }> {
table<N extends string, T extends BaseTable>() {
return new QueryBuilder<Tables & { [X in N]: T}>();
}
select(...columns: Columns<Tables>[]) {
// implemenmt here
return this
}
where<K extends Columns<Tables>>(col: K, value: Flat<Tables>[K]) {
// implemenmt here
return this
}
}
const q = new QueryBuilder<{user: {id: number; name: string}}>();
q.select("user.id", "user.name")
.where("user.name", "andrew")
.where("user.id", 3)
.table<"widget", {widgetId: string, userId: number}>()
.select("widget.widgetId", "widget.userId")
.where("widget.widgetId", "12")
分类:
TypeScript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-08-02 [SAA + SAP] 16. RDS
2021-08-02 [SAA + SAP] 15. ElastiCache
2021-08-02 [SAA + SAP] 14. CloudFront & AWS Global Accelerator
2018-08-02 [Vue @Component] Extend Vue Components in TypeScript
2017-08-02 [React] Style the body element with styled-components and "injectGlobal"
2017-08-02 [React] Style a React component with styled-components
2017-08-02 [D3] Create DOM Elements with D3 v4