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

TypeScript索引签名参数类型报错及Schema类型约束求助

解决TypeScript中约束Schema对象匹配接口类型的问题

你的代码问题分析

  1. 错误使用infer关键字:infer只能在条件类型的extends子句中用来提取类型片段,比如type ExtractReturnType<T> = T extends (...args: any[]) => infer R ? R : never这种场景。你当前的写法既没有合法的条件类型结构,也完全不需要用infer来实现需求。
  2. Record类型用法错误:Record<Keys, ValueType>要求第一个参数是键的联合类型,第二个是统一的值类型。你写的Record<T extends keyof Config ? infer keyof Config : any, any>语法完全不合法,而且用any会直接丢失所有类型约束,违背了你要做类型检查的初衷。

正确实现方案

要让schema的每个键对应对象的value类型匹配Config接口的对应键类型,你需要用映射类型来遍历Config的所有键,并为每个键生成对应的结构:

// 定义通用的Schema类型,接收一个接口T,生成对应的约束结构
type Schema<T> = {
  [K in keyof T]: {
    value: T[K]
  }
}

然后把schema的类型指定为Schema<Config>,就能自动完成类型约束:

interface Config {
  abc: string
  xyz: number
}

type Schema<T> = {
  [K in keyof T]: {
    value: T[K]
  }
}

const schema: Schema<Config> = {
  abc: {
    value: '', // ✅ 符合string类型要求
  },
  xyz: {
    value: 0, // ✅ 符合number类型要求
  },
  // ❌ 如果多写/少写键,TypeScript会报错
  // ❌ 如果把xyz的value写成字符串(比如'123'),也会触发类型错误
}

为什么这个方案有效

映射类型会自动遍历传入的接口T(也就是Config)的所有键,为每个键K生成{ value: T[K] }的结构,这样既保证了schema的键和Config完全一致,也强制每个value的类型和Config对应键的类型匹配,完美实现你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:45:57