TypeScript如何定义函数数组参数类型以自动推导内部函数入参
TypeScript函数数组类型推导方案
核心实现思路
该问题本质是:如果直接用类型[]定义数组,TypeScript会把所有数组成员合并为联合类型,丢失每个位置的独立类型信息。我们可以通过泛型捕获传入数组的元组类型,保留每个函数的完整签名,实现自动推导。
通用泛型实现
下面是支持任意数量、任意参数签名函数数组的通用写法:
// 泛型T会自动捕获传入actions数组的元组类型,完整保留每个位置的函数签名 const handleActions = <T extends ((...args: any[]) => any)[]>(actions: T) => { const [action1, action2] = actions; // 自动推导action1入参为(string) => void action1('字符串参数') // 自动推导action2入参为(string, {a: string, b: number}) => void action2('字符串参数', { a: '测试', b: 123 }) } // 调用时无需额外类型声明,自动推导 const action1 = (arg1: string) => {} const action2 = (arg1: string, arg2: {a: string, b: number}) => {} handleActions([action1, action2])
问题答疑
- 如何定义
WhatTypeIsThis实现自动推导?
不需要定义统一的WhatTypeIsThis,用上面的泛型写法即可自动捕获每个函数的类型。如果需要手动声明,也可以直接写元组类型:type ActionTuple = [typeof action1, typeof action2],再把入参定义为actions: ActionTuple。 - 是否可以定义为支持任意数量、任意入参列表的函数数组?
可以,上面的泛型写法没有限制数组长度,任意数量、任意参数签名的函数都可以传入,都会保留对应类型。 - 是否可以通过泛型实现?
可以,上面的写法就是泛型实现方案,不需要手动逐个定义类型别名,TypeScript会自动完成推导。
自定义方案说明
你采用的手动声明元组类型的方案也是可行的,适合需要固定actions数组结构、对类型可控性要求高的场景,能够有效解耦业务逻辑和基础服务逻辑,便于单元测试。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

