TypeScript动态键名类型定义及类型错误修正求助
解决TypeScript动态键类型冲突问题
问题分析
你之前的写法用了字符串索引签名[key: string]: number,这会强制对象所有属性的值都必须是number,但condition是boolean类型,所以出现类型不兼容的错误。要实现total${type}的动态键,需要用泛型+模板字面量类型来精准定义特定键,而非覆盖所有字符串键的索引签名。
解决方案
1. 定义通用返回值类型
通过泛型约束和模板字面量生成动态键,再和固定字段做交叉类型:
// 通用返回结果类型:动态生成total${T}键,搭配固定字段 type TransactionResult<T extends string> = { [`total${T}`]: number; } & { aggregate: number; condition: boolean; };
2. 定义函数类型
让函数接收泛型参数T,并返回对应的TransactionResult<T>:
// 通用函数类型,传入type字面量时自动推断动态键名 type UseDynamicTransactions = <T extends string>(type: T) => TransactionResult<T>;
3. 使用示例
调用时传入具体的类型字面量,TypeScript会自动推断出正确的键:
// 推断返回值包含totalPayments字段 const useCalculatePayments: UseDynamicTransactions = (type) => { return { [`total${type}`]: 100, aggregate: 200, condition: true }; }; const payments = useCalculatePayments('Payments'); console.log(payments.totalPayments); // 类型正确,不会报错
interface vs type 选择
这里用type更合适,原因有两点:
- 模板字面量作为对象键的场景下,
type支持直接定义这种动态键,语法更简洁; - 需要结合交叉类型合并动态键和固定字段,
type在处理这类组合逻辑时比interface更灵活(interface主要用于扩展和声明合并,不擅长这种一次性的类型组合)。另外,函数类型的定义用type也更直观。
内容的提问来源于stack exchange,提问作者user8758206
相关产品推荐
相关产品推荐

