typescript 当字段为选项时,键入深键

f45qwnt8  于 2023-08-07  发布在  TypeScript
关注(0)|答案(1)|浏览(105)

我创建了一个函数来选择和keyof深度对象。但我不知道为什么我的对象上的keyof在它是一个选项时不起作用。

type Database = {
    User?: {
        id: string
        name: string
    },
    Post?: {   // if i remove ? it work but it should be an option
        id: string
        content: string
    }
}

type SelectQuery<T> = {
    [Table in keyof T]?: {
        select: {
            [field in keyof T[Table]]?: boolean
        }
    }
}

function select(query: SelectQuery<Database>) {}

select({
    Post: {
        select: {
          // it should suggest content and id here

        
        }
    }
})

字符串
Playground链接

gblwokeq

gblwokeq1#

问题是你在Database类型中嵌套了可选字段,当你访问一个表时,你得到一个类型tableFields | undefined,而keyof在这种情况下返回never。范例:

// never
type Case1 = keyof Database['Post']

字符串
要解决此问题,您可以使用内置的NonNullable实用程序类型:

// "id" | "content"
type Case2 = keyof NonNullable<Database['Post']>


使用方法:

type SelectQuery<T> = {
  [Table in keyof T]?: {
    select: {
      [field in keyof NonNullable<T[Table]>]?: boolean;
    };
  };
};


Playground

相关问题