首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在类型记录中是否存在嵌套的Pick<>类型?

在类型记录中是否存在嵌套的Pick<>类型?
EN

Stack Overflow用户
提问于 2019-09-19 00:03:59
回答 2查看 12.1K关注 0票数 17

因此,我试图在我的客户端GraphQL查询上获得安全性(因此,如果有更好的方法,请告诉我)。

但是我一直在做的是像这样定义我的查询。

代码语言:javascript
运行
复制
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类型,我执行如下操作

代码语言:javascript
运行
复制
interface TenantManagePageQueryTenant
    extends Pick<Tenant, 'id' | 'description' | 'name'> {}

其中,基本租户模型是我的GQL模型类型。

是否存在这样的Pick语句,但也可以选择嵌套的属性。

就像这样

代码语言:javascript
运行
复制
interface TenantManagePageQueryTenant
    extends Pick<Tenant, 'id' | 'description' | 'name' | Pick<approvedUser| 'id' | 'alias'> {}
EN

回答 2

Stack Overflow用户

发布于 2020-08-16 22:48:33

@Avius发布的代码在正确的轨道上,但是扩展交叉类型的接口会生成一个错误。我相信你需要使用类型:

代码语言:javascript
运行
复制
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' 
  }]
}

操场连接

票数 10
EN

Stack Overflow用户

发布于 2020-06-10 14:27:03

不完全确定我是否正确地理解了这个问题,但也许交叉类型会有所帮助?

假设approvedUsers实际上是一个数组,类型可能如下所示:

代码语言:javascript
运行
复制
interface TenantManagePageQueryTenant extends
    Pick<Tenant, 'id' | 'description' | 'name'>
    & { approvedUsers: Pick<ApprovedUser | 'id' | 'alias'>[] }
{}

因此,这将是一个有效的TenantManagePageQueryTenant类型对象。

代码语言:javascript
运行
复制
{
  id: "123",
  description: "456",
  name: "789",
  approvedUsers: [{
    id: "aaa",
    alias: "bbb"
  }]
}

而这些办法不会:

代码语言:javascript
运行
复制
// missing alias in approvedUsers[0]

{
  id: "123",
  description: "456",
  name: "789",
  approvedUsers: [{
    id: "aaa"
  }]
}
代码语言:javascript
运行
复制
// unknown field extra in approvedUsers[0]
{
  id: "123",
  description: "456",
  name: "789",
  approvedUsers: [{
    id: "aaa",
    alias: "bbb",
    extra: 345678
  }]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58002078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档