You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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]
};

关键修改点

  1. 添加TypeMap映射:明确"string"、"number"对应的实际类型,作为类型推断的基础;
  2. 泛型改造Argument:引入泛型参数T并约束为keyof TypeMap,使type字段的取值直接关联到TypeMap[T]的实际类型;
  3. 替换ArgumentTypeI:将原定义中的ArgumentTypeI替换为TypeMap[T],让d和s方法的类型自动跟随type字段变化;
  4. 默认泛型参数:给T设置默认值keyof TypeMap,保证不指定泛型时也能兼容原有类型范围。

效果说明

  • 当type指定为"string"时,d必须返回string,s的参数为string | undefined,返回值为string[];
  • 当type指定为"number"时,对应类型自动切换为number相关的类型;
  • TypeScript会自动校验方法的参数和返回值是否与type字段匹配,提供类型安全保障。

内容的提问来源于stack exchange,提问作者CodeBreaker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:44:56