如何为createParser配置类型守卫,确保defaultValue匹配parse参数类型?
解决方案
要实现每个配置项的defaultValue与对应parse函数的参数类型严格匹配,你可以通过泛型约束实现类型层面的强制校验,无需额外类型守卫。核心思路是让TypeScript自动推断每个配置键对应的parse参数类型,并绑定到defaultValue上。
步骤1:定义单个配置项的约束类型
先定义泛型类型,强制单个配置项的defaultValue类型等于parse函数的入参类型:
type ParserConfigItem<InputType> = { parse: (input: InputType) => unknown; defaultValue: InputType; };
步骤2:为createParser添加泛型约束
让createParser接收泛型对象,其中每个属性都符合上述配置项类型,同时通过映射类型确保每个键的类型关联:
function createParser<Config extends Record<string, ParserConfigItem<any>>>(config: { [K in keyof Config]: ParserConfigItem<Parameters<Config[K]['parse']>[0]>; }) { // 示例实现:根据配置生成解析器 return { parse(key: keyof Config, input?: unknown) { const item = config[key]; return item.parse(input ?? item.defaultValue); } }; }
步骤3:验证类型校验效果
调用createParser时,TypeScript会自动校验每个配置项的类型匹配性:
// 合法示例:所有defaultValue与parse入参类型一致 const validParser = createParser({ age: { parse: (str: string) => parseInt(str, 10), defaultValue: "18" // string类型匹配parse入参 }, enabled: { parse: (bool: boolean) => bool.toString(), defaultValue: true // boolean类型匹配parse入参 } }); // 非法示例:TypeScript直接报错 const invalidParser = createParser({ wrong: { parse: (num: number) => num.toString(), defaultValue: "123" // 此处报错:"string"无法赋值给"number"类型 } });
原理说明
- 泛型
Config捕获整个配置对象的结构 - 通过
Parameters<Config[K]['parse']>[0]提取每个parse函数的首个参数类型 - 强制每个配置项的
defaultValue必须等于该类型,实现精确的键级类型约束
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

