从对象的深层键创建 TypeScript 类型

Creating a TypeScript type from a deep key of an object

我有以下对象:

const schemas = {
  POST: {
    $schema: 'https://json-schema.org/draft/2019-09/schema#',
    $id: 'https://api.netbizup.com/v1/health/schema.json',
    type: 'object',
    properties: {
      body: {
        type: 'object',
        properties: {
          greeting: {
            type: 'boolean',
          },
        },
        additionalProperties: false,
      },
    },
    required: ['body'],
  } as const,
  PUT: {
    $schema: 'https://json-schema.org/draft/2019-09/schema#',
    $id: 'https://api.netbizup.com/v1/health/schema.json',
    type: 'object',
    properties: {
      body: {
        type: 'object',
        properties: {
          modified: {
            type: 'string',
          },
        },
        required: ['modified'],
        additionalProperties: false,
      },
    },
    required: ['body'],
  } as const,
};

我正在尝试创建一个类型来从上述对象中提取 body 属性 类型,所以如果:

type MyType = { body: TWhatGoesHere }

...那么 TWhatGoesHere 将等于:

{ greeting?: boolean } | { modified: string }

我正在使用 json-schema-to-ts 包中的 FromSchema 从上面的 const 对象推断 body 类型,但我无法“自动”创建这种。

您不需要实用程序类型;它就像(很长的)括号符号一样简单:

type SchemaBodies = (typeof schemas)[keyof typeof schemas]["properties"]["body"]["properties"];

重要的部分是 keyof typeof schemas,它导致所有值的并集。

P. S. 把括号里的每条路径慢慢加上可能有助于理解:)

Playground