-
关于数据库查询
.innerJoin(table, onCondition)- SQL中的内连接,用于将两个表根据某个条件进行连接,返回两个表中都匹配的数据getTableColumns(table)- Drizzle ORM 提供的一个函数,从某个表结构中提取所有字段的列定义,我们这里返回一个嵌套对象,结果如下:
{ ...videos 表字段, user: { ...users 表字段 } }// src/modules/videos/server/procedure.ts import { eq, and, getTableColumns } from 'drizzle-orm' export const videosRouter = createTRPCRouter({ getOne: baseProcedure .input(z.object({ id: z.string().uuid() })) .query(async ({ ctx, input }) => { const [video] = await db .select({ ...getTableColumns(videos), user: {...getTableColumns(users) } }) .from(videos) .innerJoin(users, eq(videos.userId, users.id)) // 关联用户表,获取用户信息 .where(eq(videos.id, input.id)) if (!video) throw new TRPCError({ code: 'NOT_FOUND' }) return video }), }) -
tRPC类型推导
- 在Js中,可随意写变量
let x = 123、let y = "1333",因为JS是动态类型语言,运行时才知道变量类型 - TS中类型是静态的,编译时就知道变量类型,
let x:number = 123 - Type Inference 类型推导,就是TS自动猜测变量或函数的类型,当直接写
let name = "Alice",TS会根据赋值内容推断类型;函数中也会根据参数类型推断结果的类型 - 在tRPC中的类型推导,是 动态接口=>静态类型:
- 根据后端自动推断出这个接口的返回值类型,不用手写
- 自动跟随后端更新,避免重复写
inferRouterOutputs用来推导某个tRPC路由的输出类型AppRouter总路由对象,聚合了路由子模块inferRouterOutpus<AppRouter>根据AppRouter自动推断每个路由方法的输出类型['videos']['getOne']取出videos路由下的getOne这方法的返回类型
import { inferRouterOutputs } from "@trpc/server"; import { AppRouter } from "@/trpc/routers/_app"; export type VideoGetOneOutput = inferRouterOutputs<AppRouter>['videos']['getOne']; - 在Js中,可随意写变量
-
Hook
useMemo()- 缓存计算结果,避免在每次组件重新渲染时都重复执行一些开销较大的计算
Intl.NumberFormat()是JS内置的国际化 API,用来格式化数字