【发布时间】:2021-12-26 18:17:51
【问题描述】:
我有一些使用pg-to-ts 生成的模式生成类型化 SQL 查询的 TypeScript 代码:
const getUserByEmail = selectBy('user', ['email']);
// const getUserByEmail: (db: Queryable, select: Pick<User, "email">) => Promise<User[]>
这个函数工作正常并且类型正确。但我不喜欢它的显示方式。而不是在参数列表中显示select: Pick<User, "email">,我希望它显示select: {email: string},我发现它更清晰。
奇怪的是,在类型别名中写出 Pick<User, "email"> 会在您将鼠标悬停在它上面时产生所需的显示:
type ByEmail = Pick<User, 'email'>;
// type ByEmail = { email: string; }
那么如何在我的selectBy 函数中匹配该显示?这是实现的草图(full source 在 TypeScript 操场上):
export function selectBy<T extends TableNames, K extends keyof TableType<T>>(
tableName: T,
columns: K[],
) {
type OutType = TableType<T>;
type SelectType = Pick<OutType, K>;
let query = `SELECT * FROM ${tableName} ...`;
return async (db: Queryable, select: SelectType): Promise<OutType[]> =>
(
await db.query(
query,
columns.map(c => select[c]),
)
).rows;
}
我知道一些控制类型显示的技巧,例如 {} & 和 Exclude<K, never>,但我无法让它们在这个 sn-p 上工作。
【问题讨论】:
标签: typescript