[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")

 

posted @   Zhentiw  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源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
点击右上角即可分享
微信分享提示