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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:05:26