如何对每个条目为同类型但泛型不同的Record进行类型检查?
如何一次性检查包含Stringifier的对象类型一致性?
我们需要创建一个包含多种数据类型与字符串互转方法的对象,定义的Stringifier类型如下:
type Stringifier<Source> = { stringIn: (string: string) => Source; stringOut: (source: Source) => string; };
核心需求是让TypeScript类型检查器确保对象中每个Stringifier的stringIn输出类型与stringOut输入类型严格一致。目前的做法是为每个条目单独调用isStringifier函数来做类型校验,现在想实现一次性检查整个对象的效果。
方案一:用泛型映射类型约束对象
我们可以定义一个泛型映射类型,让它自动约束对象中每个属性对应的Stringifier类型一致性,无需额外函数调用:
type Stringifier<Source> = { stringIn: (string: string) => Source; stringOut: (source: Source) => string; }; // 定义泛型映射类型,确保每个键对应的Stringifier的Source类型匹配 type StringifierMap<Map extends Record<string, unknown>> = { [K in keyof Map]: Stringifier<Map[K]>; }; // 直接用该类型约束对象,手动声明每个键对应的目标类型 const myStringifiers: StringifierMap<{ number: number; boolean: boolean; }> = { number: { stringIn: string => { const parsed = parseInt(string); return isNaN(parsed) ? 0 : parsed; }, stringOut: source => `${source}`, }, boolean: { stringIn: string => string !== "" && string !== "false", stringOut: source => source === false ? "" : "true", }, };
方案二:用包裹函数自动推导类型
如果不想手动声明每个键的类型,可以写一个接受整个对象的函数,让TypeScript自动推导每个属性的泛型,一次性完成校验:
type Stringifier<Source> = { stringIn: (string: string) => Source; stringOut: (source: Source) => string; }; // 定义包裹函数,自动推导每个属性的Stringifier类型 function createStringifiers<Map extends Record<string, unknown>>( map: { [K in keyof Map]: Stringifier<Map[K]> } ) { return map; } // 传入整个对象,一次性完成类型检查 const myStringifiers = createStringifiers({ number: { stringIn: string => { const parsed = parseInt(string); return isNaN(parsed) ? 0 : parsed; }, stringOut: source => `${source}`, }, boolean: { stringIn: string => string !== "" && string !== "false", stringOut: source => source === false ? "" : "true", }, });
这两种方案都能避免为每个条目单独调用检查函数,一次性完成整个对象的类型校验,确保每个Stringifier的stringIn输出和stringOut输入类型严格匹配。方案二更简洁,无需手动声明类型;方案一的类型声明更直观,适合需要明确标注类型的场景。
内容的提问来源于stack exchange,提问作者RobertAKARobin
相关产品推荐
相关产品推荐

