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

