从对象的深层键创建 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. 把括号里的每条路径慢慢加上可能有助于理解:)
我有以下对象:
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. 把括号里的每条路径慢慢加上可能有助于理解:)