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

如何为TypeScript函数指定返回值为入参数组元素的键映射

TypeScript函数返回类型匹配传入数组元素作为键的类型约束问题

我有如下TypeScript函数:

type Action = 'doX' | 'doY'
function canIPerform(actions: Action[]) : {[action: string]: Boolean} {
    // 一些业务逻辑
    return {'doX': true}
}

我希望为该函数指定类型,让返回的对象仅包含传入参数数组中的元素作为键:

let x = canIPerform(['doX'])
// x的类型应为 {[k in 'doX']: boolean}

let x = canIPerform(['doY', 'doX'])
// x的类型应为 {[k in 'doX' | 'doY']: boolean}

问题在于数组是运行时概念,目前我只能通过让调用者使用as const来实现类型约束:

let x = canIPerform(['doX', 'doY'] as const)

但我找不到强制调用者这么做的方法,试过多种方式,始终找不到适用于元组的类似keyof的语法。


解决方案:用泛型约束元组类型实现自动推导

你可以通过泛型约束传入的数组为只读元组,同时限制元组元素为Action类型,让TypeScript自动推导传入的具体元素,并生成对应的返回类型,还能强制调用者传入固定元组而非动态数组。

改写后的函数定义

type Action = 'doX' | 'doY';

// 泛型T约束为只读的Action元素元组,确保类型可推导
function canIPerform<T extends readonly Action[]>(actions: T): {
  [K in T[number]]: boolean;
} {
  // 业务逻辑示例:遍历传入的action生成结果
  const result = {} as { [K in T[number]]: boolean };
  for (const action of actions) {
    // 替换为实际业务判断逻辑
    result[action] = true;
  }
  return result;
}

效果验证

调用时无需手动加as const,TypeScript会自动推导返回类型:

// x的类型为 { doX: boolean }
const x = canIPerform(['doX']);
// y的类型为 { doX: boolean; doY: boolean }
const y = canIPerform(['doY', 'doX']);

强制禁止动态数组传入(可选)

如果想彻底避免调用者传入无法推导固定类型的动态数组(比如const arr: Action[] = ['doX']; canIPerform(arr)),可以进一步约束泛型为非空元组:

function canIPerform<T extends readonly [Action, ...Action[]]>(actions: T): {
  [K in T[number]]: boolean;
} {
  // 业务逻辑同上
}

此时如果传入动态数组,TypeScript会直接报错,强制必须传入字面量形式的固定元组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:22:17