TypeScript索引签名参数类型报错及Schema类型约束求助
解决TypeScript中约束Schema对象匹配接口类型的问题
你的代码问题分析
- 错误使用
infer关键字:infer只能在条件类型的extends子句中用来提取类型片段,比如type ExtractReturnType<T> = T extends (...args: any[]) => infer R ? R : never这种场景。你当前的写法既没有合法的条件类型结构,也完全不需要用infer来实现需求。 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
相关产品推荐
相关产品推荐

