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
相关产品推荐
相关产品推荐

