【发布时间】:2021-09-07 18:38:04
【问题描述】:
我正在尝试为我的项目创建一些可扩展的查询解析器。 它应该解析传入的查询字符串并返回类型化的对象。它还应该获取类型化的对象并返回字符串。
让我们想象一下,对于每个单独的参数,我都有我的参数化处理程序 QueryParamHandler
class QueryParamHandler<T> {
parse(v: string): T;
stringify(v: T): string;
}
然后我为我想要的每种类型设置了一组处理程序
const stringParser: QueryParamHandler<string> = ...;
const numberParser: QueryParamHandler<number> = ...;
const booleanParser: QueryParamHandler<boolean> = ...;
const dateParser: QueryParamHandler<Date> = ...;
现在我想创建一个包装器,它可以根据我在构造函数中提供的解析器集来解析整套参数
class MyCoolHandler<...> {
constructor<TP>(handlers: TP extends Record<string, QueryParamHandler<any>>) {}
parse(query: string): TV? {}
stringify(vals: TV?): string {}
}
那么我应该如何描述类型 TV(其中所有值都可以未定义)以强制打字稿根据传递的处理程序检查它? 我将在以下示例中描述所需的行为:
const handler = new MyCoolHandler({ str: stringParser, from: dateParser });
handler.stringify({}); // ok
handler.stringify({ str: 'qqq' }); // ok
handler.stringify({ numb: 3 }); // TS error, `numb` key is not allowed here
handler.stringify({ from: 'qq' }); // TS error, `from` key should be Date type
const params = handler.parse('str=&from=2021-09-07')
console.log(params.str) // ''
console.log(params.numb) // TS error, params doesn't have 'numb' key
【问题讨论】:
-
请分享可重现的示例。你从哪里得到
TP和TV。请摆脱语法错误 -
TP 是我们在构造函数中得到的。电视是我要从最后一个代码示例中获得结果的东西
标签: typescript