【发布时间】:2020-01-28 21:06:25
【问题描述】:
我正在尝试将参数的结果映射到回调,并且我正在努力在 TypeScript 中键入它。 我有以下功能:
type CustomRouteType<TParam = any> = <T>(value?: T) => TParam;
const createRoute = <TTypes extends CustomRouteType[]>
(dictionary: RouteDictionary<TTypes>,
callback: (...params: TTypes) => void) => {
// Logic Here
}
createRoute(
route`/api/someEndpoint/${Number}/${String}/test`,
(p1, p2) => {
});
路由函数将字符串文字转换为自定义字典,该字典公开路由中的参数,因此我无法预先知道路由函数可能返回的类型。 在示例中,这将返回一个 RouteDictionary 并且我在回调中设置 p1 和 p2 的方式是那些构造函数,我想将这些参数映射为这些构造函数的 ReturnValue 的类型.
Typescript 只有 ReturnValue 而不是 ReturnValues 我如何映射这些类型以便回调函数的参数推断出我正在寻找的返回类型?
供参考:
class RouteString {
constructor(public routeString: string) { }
}
class RouteParameter<T = any> {
constructor(public routeString: CustomRouteType<T>) { }
}
type RouteDictionary<TTypes extends CustomRouteType[]> = {
routeParts: (RouteString | RouteParameter)[]
types: TTypes
}
const route = <TParams extends any[], TTypes extends CustomRouteType<any>[]>
(template: TemplateStringsArray, ...keys: TTypes): RouteDictionary<TTypes> => {
let routeParts: (RouteString | RouteParameter)[] = [];
const stringParts = template.raw || [];
for (let partIndex = 0; partIndex < stringParts.length; partIndex++) {
const part = stringParts[partIndex];
const stringChunks = part.split('/').filter(chunkPart => chunkPart !== String())
routeParts = [... routeParts, ...stringChunks.map(chunk => new RouteString(chunk))]
if (keys.length === 0) continue
if (keys.length < partIndex) continue
const routeParam = keys[partIndex]
if (!routeParam) continue
routeParts = [...routeParts, new RouteParameter(routeParam)]
}
return {
routeParts,
types: keys
};
}
【问题讨论】:
-
您能否包括
RouteDictionary和route的定义或它们的来源? -
我认为这对问题没有影响,我会添加它
标签: typescript typescript-typings