确保函数签名类型安全: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
相关产品推荐
相关产品推荐

