gpt4 book ai didi

javascript - 在返回的对象中类型检查正确的键值使用

转载 作者:行者123 更新时间:2023-12-04 08:38:11 25 4
gpt4 key购买 nike

我有一个可能的响应主体的(生成的)类型定义:

type ResponseMap = {
'200': { 'ok': true },
'404': { 'error': true, type: 'NotFound' },
'500': null,
}
我想编写一个函数来返回形状为 { code, body } 的对象根据上面的打字检查。
我能够完成的最好的事情如下:
type Codes<Bodies> = keyof Bodies

type ResponseCodeBodyPair<Bodies extends Record<string, unknown>> = {
code: Codes<Bodies>,
body: Bodies[Codes<Bodies>]
}

function endpoint(): ResponseCodeBodyPair<ResponseMap> {
if (Math.random()) {
return { code: '200', body: { 'ok': true } }
}
if (Math.random()) {
return { code: '404', body: { 'error': true, type: 'NotFound' } }
}
if (Math.random()) {
return { code: '500', body: null }
}

// This should fail since { ok: true } is not a valid body for 404.
return { code: '404', body: { 'ok': true } }
}
此检查是否有函数返回的未知状态代码以及所有返回的主体是否与可能的主体形状之一对应。
它不检查代码到正文配对的正确性,如上次返回所示。
如何将类型限制为状态代码的精确体型?
我需要类似的东西
type ResponseCodeBodyPair<Bodies extends Record<string, unknown>> =
Code extends keyof Bodies ? { code: Code, body: Bodies[Code] } : never
……但这当然行不通。
我在同样的情况下挣扎了很多次,但总是放弃。它实际上是不可能的还是我错过了什么?

附言我知道如果类型是 { code: '200', body: … } | { code: '404', … } | … 就可以了但我没有那个可用。这就是为什么我需要以某种方式将 map /记录转换为这种联合类型。

最佳答案

我发现了正确的方法来做到这一点。
我可以映射{ [Code]: Response }对象到 { [Code]: { code: Code, body: Response } }对象并通过 T[keyof T] 获取该对象的值这导致我需要的确切类型。

type ResponseCodeBodyPairMap<M> = {
[Code in keyof M]: { code: Code, body: M[Code] }
}

type Values<T> = T[keyof T]

type ResponseCodeBodyPair<M> = Values<ResponseCodeBodyPairMap<M>>

关于javascript - 在返回的对象中类型检查正确的键值使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64694591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com