打字稿:映射类型中的枚举键
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打字稿:映射类型中的枚举键相关的知识,希望对你有一定的参考价值。
我有一个http方法的枚举:
export enum HttpMethod {
GET = 'GET', POST = 'POST', /*...*/
}
然后我定义一个基本的方法类型,可以有任何HttpMethod
作为键:
type Methods = {
[M in HttpMethod]?: any;
};
基本的Route类型可以使用此Method类型:
type Route<M extends Methods = any> = {
methods: M;
}
所以我可以定义任何路线,如:
interface AnyRoute extends Route<{
[HttpMethod.GET]: AnyRequestHandler;
}> {}
到现在为止还挺好。现在我要添加一个Validator
:
type Validator<R extends Route, M extends HttpMethod> = {/*...*/}
并且只想允许将Method
s添加到Validator
中定义的Route
:
type RouteMethodValidators<R extends Route> = {
[M in keyof R['methods']]?: Validator<R, M>;
};
虽然我的IDE似乎理解它,但我收到以下错误:
Type 'M' does not satisfy the constrain 'HttpMethod'.
Type 'keyof R["methods"]' is not assignable to type 'HttpMethod'.
有什么方法可以告诉打字稿,这绝对是HttpMethod
的成员吗?
答案
你的问题主要在于:type Route<M extends Methods = any>
首先,默认值any
将导致M
在string
中的RouteMethodValidator
类型,因为Route<any>['methods']
是any
而keyof any
是string
。
现在,将默认值更改为Methods
仍然无法解决问题,因为你执行M extends Methods
这基本上意味着M
可以拥有比Methods
中定义的更多的键,即比HttpMethods
中定义的更多。但在Validator
你只允许HttpMethods
的值。
我相信你最好的选择是让Route
不通用。
type Route = {
methods: Methods;
}
type RouteMethodValidators<R extends Route> = {
[M in HttpMethod]?: Validator<R, M>;
}
以上是关于打字稿:映射类型中的枚举键的主要内容,如果未能解决你的问题,请参考以下文章