【发布时间】:2021-01-27 16:40:50
【问题描述】:
我已经超出了我的深度。我想对具有可选“解析”函数的泛型进行推断,该函数反过来返回格式化值[或抛出]。
代码说了一千多个单词,所以就这样吧:
export type RouteDefInput<TInput = unknown> = {
parse: (input: unknown) => TInput;
};
export type RouteDefResolver<
TContext = unknown,
TInput = unknown,
TOutput = unknown
> = (opts: { ctx: TContext; input: TInput }) => Promise<TOutput> | TOutput;
export type RouteDef<
TContext = unknown,
TInput = unknown,
TOutput = unknown
> = {
input?: RouteDefInput<TInput>;
resolve: RouteDefResolver<TContext, TInput, TOutput>;
};
export type inferRouteInput<
TRoute extends RouteDef<any, any, any>
> = TRoute['input'] extends RouteDefInput<any>
? ReturnType<TRoute['input']['parse']>
: undefined;
const context = {};
function createRoute<TInput, TOutput>(
route: RouteDef<typeof context, TInput, TOutput>,
) {
return route;
}
function stringParser(input: unknown): string {
if (typeof input === 'string') {
return input;
}
throw new Error('not a string');
}
const myRoute1 = createRoute({
input: {
parse: stringParser,
},
resolve({ input }) {
return {
output: input,
};
},
});
const myRoute2 = createRoute({
resolve({ input }) {
return {
output: input,
};
},
});
// this should render MyRouteInput1 as "string"
type MyRouteInput1 = inferRouteInput<typeof myRoute1>;
// this should render MyRouteInput2 as "undefined" (works)
type MyRouteInput2 = inferRouteInput<typeof myRoute2>;
我怎样才能正确地使inferRouteInput 在这两种情况下都适用?
谢谢一百万! ????
任何链接到关于这个主题或 TypeScript 泛型的良好阅读也很受欢迎,因为我很难找到好的阅读来源。
【问题讨论】:
标签: typescript generics