因此,我试图在我的客户端GraphQL查询上获得安全性(因此,如果有更好的方法,请告诉我)。
但是我一直在做的是像这样定义我的查询。
export const tenantManagePageQuery = async (tenantId: string) =>
graphQLClient.request<{
tenants: TenantManagePageQueryTenant[];
}>(
/* GraphQL */ `
query tenants($tenantId: String!) {
tenants(tenantIds: [$tenantId]) {
id
description
name
approvedUsers {
id
alias
}
pendingUsers {
id
alias
}
}
}
`,
{ tenantId },
);为了定义TenantManagePageQueryTenant类型,我执行如下操作
interface TenantManagePageQueryTenant
extends Pick<Tenant, 'id' | 'description' | 'name'> {}其中,基本租户模型是我的GQL模型类型。
是否存在这样的Pick语句,但也可以选择嵌套的属性。
就像这样
interface TenantManagePageQueryTenant
extends Pick<Tenant, 'id' | 'description' | 'name' | Pick<approvedUser| 'id' | 'alias'> {}发布于 2020-08-16 22:48:33
@Avius发布的代码在正确的轨道上,但是扩展交叉类型的接口会生成一个错误。我相信你需要使用类型:
type TenantManagePageQueryTenant = Pick<Tenant, 'id' | 'description' | 'name'>
& { approvedUsers: Pick<ApprovedUser, 'id' | 'alias'>[] }
{ }
interface Tenant {
id:string;
description:string;
name:string;
}
interface ApprovedUser {
id:string;
alias:string;
}
let tenant:TenantManagePageQueryTenant = {
id: "123",
description: "456",
name: "789",
approvedUsers: [{
id: "aaa",
alias: "bbb" // To see the desired type warning, try removing 'alias'
}]
}发布于 2020-06-10 14:27:03
不完全确定我是否正确地理解了这个问题,但也许交叉类型会有所帮助?
假设approvedUsers实际上是一个数组,类型可能如下所示:
interface TenantManagePageQueryTenant extends
Pick<Tenant, 'id' | 'description' | 'name'>
& { approvedUsers: Pick<ApprovedUser | 'id' | 'alias'>[] }
{}因此,这将是一个有效的TenantManagePageQueryTenant类型对象。
{
id: "123",
description: "456",
name: "789",
approvedUsers: [{
id: "aaa",
alias: "bbb"
}]
}而这些办法不会:
// missing alias in approvedUsers[0]
{
id: "123",
description: "456",
name: "789",
approvedUsers: [{
id: "aaa"
}]
}// unknown field extra in approvedUsers[0]
{
id: "123",
description: "456",
name: "789",
approvedUsers: [{
id: "aaa",
alias: "bbb",
extra: 345678
}]
}https://stackoverflow.com/questions/58002078
复制相似问题