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

TypeScript:如何将传入的字面量参数作为对象键使用?

解决方案:根据参数识别对象键并访问对应值

你的需求完全可以实现,原代码的问题在于{[arg]:string}是不合法的TypeScript语法(索引签名不能直接使用函数参数变量),下面提供两种可行的解决方案:

方案一:使用泛型约束(推荐)

通过泛型绑定参数类型,让TypeScript精准推断返回对象的结构,无需额外类型判断:

async function func<T extends 'key1' | 'key2'>(arg: T) {
  // 泛型遍历生成对应键的对象类型
  const obj: { [K in T]: string } = await fetchResult('url');
  console.log(obj[arg]);
}

// 调用示例
await func('key1'); // 输出 'result1'
await func('key2'); // 输出 'result2'

这种方式下,当你传入'key1'时,TypeScript会自动推断obj的类型为{key1: string};传入'key2'时则推断为{key2: string},编译时就能确保类型安全,直接访问obj[arg]不会报错。

方案二:联合类型+类型守卫

如果fetchResult返回的是固定的联合类型(要么含key1,要么含key2),可以先定义返回类型,再通过类型守卫缩小范围:

// 定义fetchResult的返回类型
type FetchResult = { key1: string } | { key2: string };

async function func(arg: 'key1' | 'key2') {
  const obj: FetchResult = await fetchResult('url');
  // 用in操作符做类型守卫,确认obj包含目标键
  if (arg in obj) {
    console.log(obj[arg]);
  }
}

这里通过arg in obj让TypeScript知道当前obj确实包含arg对应的键,从而安全访问对应值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:47:25