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

确保函数签名类型安全:TypeScript配置对象参数匹配问题

解决Config对象format方法参数的类型关联问题

你的问题出在原代码中直接使用Config<Data, keyof Data>作为数组元素类型,此时ConfigId是'testA' | 'testB'联合类型,导致format的参数类型变成Data[keyof Data]即number | string,无法和id对应的具体类型关联。

下面是两种可行的解决方式:

方式一:通过映射类型生成关联的联合类型

export interface Config<D, ConfigId extends keyof D> {
  id: ConfigId;
  format?: (value: D[ConfigId]) => any;
}

type Data = { testA: number; testB: string };

// 为Data的每个key生成对应的Config类型,再取这些类型的联合
type DataConfig = { [K in keyof Data]: Config<Data, K> }[keyof Data];

const configObjs: readonly DataConfig[] = [
  {
    id: 'testA',
    format: (value) => {
      // value自动推断为number类型,可调用number方法
      return value.toFixed(2);
    },
  },
  {
    id: 'testB',
    format: (value) => {
      // value自动推断为string类型,可调用string方法
      return value.toUpperCase();
    },
  },
];

方式二:用泛型函数辅助类型推导

export interface Config<D, ConfigId extends keyof D> {
  id: ConfigId;
  format?: (value: D[ConfigId]) => any;
}

type Data = { testA: number; testB: string };

// 泛型函数自动推导每个配置对应的key类型
function createConfig<K extends keyof Data>(config: Config<Data, K>) {
  return config;
}

const configObjs = [
  createConfig({
    id: 'testA',
    format: (value) => {
      // value类型为number
      return value;
    },
  }),
  createConfig({
    id: 'testB',
    format: (value) => {
      // value类型为string
      return value;
    },
  }),
] as const;

这两种方式都能让format方法的参数类型和id对应的字段类型严格关联,实现你需要的类型检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 01:07:40