如何在TypeScript中将接口转换为指定结构的数组元组类型?
TypeScript:将接口转换为支持可选重复键的元组数组类型
可以实现,下面根据你的需求给出两种实现方案:宽松匹配和严格匹配。
需求回顾
你定义的接口:
interface SocketServerEvents { complete: (data: string) => void; response: (data: number) => void; error: (error: string) => void; }
目标是构造一个元组数组类型,满足:
- 每个元素为
[keyof SocketServerEvents, SocketServerEvents[keyof SocketServerEvents]]格式的元组 - 键可以重复出现
- 键为可选
实现方案
1. 宽松匹配方案
此方案允许键可选,且handler可以是接口中任意事件的处理函数类型(无需和键严格对应):
// 单个元组元素类型:键可选,handler为接口中任意处理函数类型 type LooseEventTuple = [key?: keyof SocketServerEvents, handler: SocketServerEvents[keyof SocketServerEvents]]; // 目标数组类型:任意数量的LooseEventTuple元素(支持重复键) type LooseEventTupleArray = LooseEventTuple[];
2. 严格匹配方案
此方案更严谨:若指定键,则handler必须和该键对应的接口类型严格匹配;键依然可选,未指定键时handler可以是任意处理函数类型:
// 生成所有键与对应handler严格匹配的元组联合类型 type StrictKeyEventTuple = { [K in keyof SocketServerEvents]: [K, SocketServerEvents[K]]; }[keyof SocketServerEvents]; // 加上键可选的情况,组合成最终的单个元组元素类型 type StrictEventTuple = StrictKeyEventTuple | [undefined, SocketServerEvents[keyof SocketServerEvents]]; // 目标数组类型:任意数量的StrictEventTuple元素(支持重复键) type StrictEventTupleArray = StrictEventTuple[];
示例验证
// 宽松版示例(允许handler与键不匹配) const looseExample: LooseEventTupleArray = [ ["complete", (data: string) => {}], ["response", (data: number) => {}], ["error", (data: number) => {}], // 此处handler类型不匹配error键,但宽松版允许 ["complete", (data: number) => {}], // 重复键+不匹配handler [undefined, (data: string) => {}] // 省略键 ]; // 严格版示例(handler必须与指定键匹配) const strictExample: StrictEventTupleArray = [ ["complete", (data: string) => {}], ["response", (data: number) => {}], ["error", (error: string) => {}], // handler必须匹配error键的类型 ["complete", (data: string) => {}], // 重复键允许 [undefined, (data: number) => {}] // 省略键 ];
内容的提问来源于stack exchange,提问作者Mikey A. Leonetti
相关产品推荐
相关产品推荐

