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

如何推断无泛型参数字段类型?TypeScript组件配置类型问题

问题分析与解决方案

错误原因

你写的ComponentConfig类型最终会被解析为never,因为never extends infer Props会把Props推断为never,而never并不满足Record<string, any>约束,最终整个类型收缩为never。任何符合预期的配置对象都无法赋值给never类型,因此触发TS2322错误。

优雅实现方式

1. 定义泛型ComponentConfig类型

先明确泛型约束,让Props必须满足Record<string, any>:

// 假设你的Component类型定义如下
type Component<Props extends Record<string, any>> = /* 你的Component实现 */;

type ComponentConfig<Props extends Record<string, any>> = {
  component: Component<Props>;
  props(): Props;
};

2. 自动推断类型的字典定义

借助辅助函数让TypeScript自动推断每个配置的Props类型,无需手动传递泛型参数:

// 辅助函数用于自动推导Props类型
function createComponentConfig<Props extends Record<string, any>>(config: ComponentConfig<Props>) {
  return config;
}

// 示例Component实现
type Component<Props extends Record<string, any>> = (props: Props) => void;
const NumberComponent: Component<{ num: number }> = (props) => console.log(props.num);

// 创建配置字典
const componentDict = {
  numberComp: createComponentConfig({
    component: NumberComponent,
    props() {
      return { num: 42 }; // 自动推断返回类型为{ num: number }
    }
  }),
  textComp: createComponentConfig({
    component: (props: { text: string }) => console.log(props.text),
    props() {
      return { text: "hello" }; // 自动推断返回类型为{ text: string }
    }
  })
};

3. 简化字典类型(可选)

如果不需要精确的Props类型检查,也可以直接定义字典类型为所有合法ComponentConfig的集合:

type ComponentDictionary = {
  [key: string]: ComponentConfig<Record<string, any>>;
};

const componentDict: ComponentDictionary = {
  numberComp: {
    component: NumberComponent,
    props() {
      return { num: 42 };
    }
  }
};

内容的提问来源于stack exchange,提问作者Koppa Péter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:23:32