【发布时间】:2021-03-02 18:27:05
【问题描述】:
我有一个 TypeScript interface,它定义了我可以在 REST 端点上使用的 HTTP 方法和查询参数类型(请参阅 crosswalk 了解您为什么要这样做的详细信息):
interface API {
'/endpoint': {
get: {a?: string, b?: string};
post: {b?: string, c?: string};
}
}
我想定义一个函数,该函数采用此 API 类型、端点 ('/endpoint') 以及可选的 HTTP 动词('get'、'post' 等)和适当的查询参数:
const urlMaker = apiUrlMaker<API>();
urlMaker('/endpoint')({a: 'a', b: 'b'}); // should be an error, we don't know that "a" is OK.
urlMaker('/endpoint')({b: 'b'}); // fine, "b" is always safe. Should return "/endpoint?b=b".
urlMaker('/endpoint', 'get')({a: 'a', b: 'b'});
// fine, we're explicitly using get. Should return "/endpoint?a=a&b=b".
在用户省略 HTTP 动词的情况下,我想接受此方法的查询参数类型的交集(即可以传递给任何动词的查询参数类型)。
我可以通过这种方式获得类型的 union:
type ParamUnion = API['/endpoint'][keyof API['/endpoint']];
// type is {a?: string, b?: string} | {b?: string, c?: string}
我知道converting unions to intersections 的诀窍,但我想知道在这种情况下是否有一种方法可以不通过联合。当然,除了get 和post(delete、put、patch 等)之外,还可以为端点定义任意数量的 HTTP 动词。
【问题讨论】:
标签: typescript