在knex中混叠列时维护类型推断



假设我有两个表:AB,每一行类型为

type ARow = {
primaryId: number;
name: string
};
type BRow = {
foreignId: number;
name: string;
}

Knex足够聪明,可以推断出从每个表中选择结果的类型:

// aList is inferred to be of type { primaryId: number, name: string }[]
const aList = await knex<ARow>("a").select("primaryId", "name")

这甚至可以通过混叠来实现(只要我们只引用列名而不是表):

// aList is inferred to be of type { id: number, description: string }[]
const aList = await knex<ARow>("a").select({
id: "primaryId",
description: "name",
})

然而,AB都有一个name,我想单独别名:

// joined is inferred to be of type { id: any, aName: any, bName: any }[]
const joined = await knex<ARow>("a")
.join<BRow>("b", "primaryId", "foreignId")
.select({
id: "primaryId",
aName: "a.name",
bName: "b.name",
})

在基于表的混叠列时是否有保留类型安全的方法?

const joined = knex<ARow>("a")
.join<BRow>("b", "primaryId", "foreignId")
.select(
knex.ref("primaryId"),
knex.ref("name").as("aName").withSchema("a"),
knex.ref("name").as("bName").withSchema("b")
);

最新更新