如何修改TypeScript示例使Argument接口方法共享对应泛型类型
问题与解决方案
问题描述
我想要实现这样的功能:为Argument类型扩展多个共享同一关联类型的方法,具体类型定义如下:
type ArgumentType = "string" | "number" type Argument = { type: ArgumentType; d?: () => ArgumentTypeI s?: (v: ArgumentTypeI | undefined) => ArgumentTypeI[] }
其中ArgumentTypeI是TypeMap中ArgumentType对应的实际类型实例(比如"string"对应string,"number"对应number)。需要修改@wonderflame提供的示例代码,以支持上述需求。
编辑补充:我已更新示例,展示了预期实现效果。
解决方案
核心思路
通过泛型约束结合类型映射表,将Argument的type字段与d、s方法的参数/返回值类型绑定,实现类型的自动推断。
完整实现代码
// 定义类型映射表,建立字符串标识与实际类型的关联 type TypeMap = { string: string; number: number; }; // 泛型化Argument类型,让type字段与关联类型绑定 type Argument<T extends keyof TypeMap = keyof TypeMap> = { type: T; d?: () => TypeMap[T]; s?: (v: TypeMap[T] | undefined) => TypeMap[T][]; }; // 测试用例 const stringArgument: Argument<"string"> = { type: "string", d: () => "default value", s: (value) => value ? [value] : ["fallback"] }; const numberArgument: Argument<"number"> = { type: "number", d: () => 999, s: (value) => value ? [value] : [0] };
关键修改点
- 添加TypeMap映射:明确
"string"、"number"对应的实际类型,作为类型推断的基础; - 泛型改造Argument:引入泛型参数
T并约束为keyof TypeMap,使type字段的取值直接关联到TypeMap[T]的实际类型; - 替换ArgumentTypeI:将原定义中的
ArgumentTypeI替换为TypeMap[T],让d和s方法的类型自动跟随type字段变化; - 默认泛型参数:给
T设置默认值keyof TypeMap,保证不指定泛型时也能兼容原有类型范围。
效果说明
- 当
type指定为"string"时,d必须返回string,s的参数为string | undefined,返回值为string[]; - 当
type指定为"number"时,对应类型自动切换为number相关的类型; - TypeScript会自动校验方法的参数和返回值是否与
type字段匹配,提供类型安全保障。
内容的提问来源于stack exchange,提问作者CodeBreaker
相关产品推荐
相关产品推荐

