首页 > 其他分享 >[Typescript] Advance query builder example

[Typescript] Advance query builder example

时间:2024-08-02 14:49:56浏览次数:12  
标签:Advance Typescript string Tables builder never keyof extends infer

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

 

标签:Advance,Typescript,string,Tables,builder,never,keyof,extends,infer
From: https://www.cnblogs.com/Answer1215/p/18338749

相关文章

  • [Typescript] Query builder example
    classQueryBuilder{privatefields:string[]=[]privatewheres:Record<string,string>={}privatetable:string=""select(...columns:string[]){this.fields=columnsreturnthis}from(table:string){t......
  • 24-7-31String类,StringBuffer类,StringBuilder类的详解与比较
    24-7-31String类,StringBuffer类,StringBuilder类的详解与比较文章目录24-7-31String类,StringBuffer类,StringBuilder类的详解与比较StringString的结构String的方法String对象的两种创建方法String的其他方法String练习StringExercise01StringExercise02StringExer......
  • [Typescript] Excess Properties in Functions
    interfaceUser{id:number;name:string;}constusers=[{name:'Waqas',},{name:'Zain',},];constusersWithIds:User[]=users.map((user,index)=>({...user,id:index,//@ts-expect-error......
  • HBuilderX 开发中使用 Node.js 搭建PDA扫码程序的服务端过程
    以下是使用HBuilderX和Node.js搭建程序服务端的大致步骤: 1. 安装Node.js首先,从Node.js官方网站下载并安装适合您操作系统的版本。在命令提示符中执行node-v,npm-v,检查nodejs版本是否安装完成。配置环境变量。2. 安装Oracle客户端根据您的操作系统,下载并安......
  • drush ev ‘\Drupal::service(“router.builder“)->rebuild();‘
    【chatgpt】这是一个用于Drupal网站的Drush命令,用于重建路由信息。在Drupal中,路由信息用于定义URL路径与回调函数之间的映射关系,以便Drupal能够正确处理来自用户的请求。路由信息由模块提供,并在Drupal的路由系统中进行注册和管理。Drush是一个用于在命令行中管理和......
  • 了解Web标准,HTML 语法规范,使用 HBuilder X 构建文档骨架,HBuilder X 生成骨架标签新增
    Web标准是由W3C组织和其他标准化组织制定的一系列标准的集合。W3C(万维网联盟)是国际最著名的标准化组织。遵循Web标准可以让不同的开发人员写出的页面更标准、更统一外,还有以下优点:1.让Web的发展前景更广阔。2.内容能被更广泛的设备访问。3.更容易被搜寻引擎搜索。......
  • typescript基础语法补充
    TypeScript是一种由微软开发的开源编程语言,它是JavaScript的一个超集,增加了静态类型和一些面向对象的特性。下面是对TypeScript的一些关键知识点的总结:TypeScript的特点超集:TypeScript完全兼容JavaScript,所有有效的JavaScript代码也是有效的TypeScript代码。静态类型:Ty......
  • [Typescript] handle event.target type in Form
    TheerrorweencounteredinthischallengewasthattheEventTarget|nulltypewasincompatiblewiththerequiredparameteroftypeHTMLFormElement.Theproblemstemsfromthefactthatthesetypesdon'tmatch,andnullisnotpermitted:constdata......
  • [Typescript] Restrict available operations on values using value objects
    ValueObjectsareanotherpatterninDomain-drivenDesignthatprovidemorestructurearoundwhatyoucanandcannotdowithatype.InTypeScriptwecreateValueObjectswithclassesthatwilldefinewhatoperationscanbeperformedtothevalueonthec......
  • typescript: vscode create project
       npmcreatevue@latestcdvue-projectnpmi-Dtypescriptnpminstall-gtypescriptts-nodenpminstallwebpack-gnpminstall-g@vue/clinpminstall-gtypescripttsc--versionnpminstall--gcreate-vueornpminstall--g@vue/clinp......