[TypeScript]:通过两个泛型枚举索引类型

[TypeScript]:通过两个泛型枚举索引类型,typescript,typescript-typings,Typescript,Typescript Typings,我试图通过索引从类型中获取函数的返回类型,其中索引是泛型类型变量 代码: enum协议{P1=0,P2=1}; 枚举协议_P1_空间{S11=0,S12=1}; 枚举协议_P2_空间{S21=0,S22=1}; 类型对象={ [方案P1]:{ [PROTOCOL_P1_SPACE.S11]:{a:string}, [PROTOCOL_P1_SPACE.S12]:{b:Array}, }, [协议P2]:{ [PROTOCOL_P2_SPACE.S21]:{c:number}, [PROTOCOL

我试图通过索引从类型中获取函数的返回类型,其中索引是泛型类型变量

代码:

enum协议{P1=0,P2=1};
枚举协议_P1_空间{S11=0,S12=1};
枚举协议_P2_空间{S21=0,S22=1};
类型对象={
[方案P1]:{
[PROTOCOL_P1_SPACE.S11]:{a:string},
[PROTOCOL_P1_SPACE.S12]:{b:Array},
},
[协议P2]:{
[PROTOCOL_P2_SPACE.S21]:{c:number},
[PROTOCOL_P2_SPACE.S22]:{d:Buffer},
},
};
函数getObject<
TProtocol扩展了协议,
TSpace扩展了协议P1_空间|协议P2_空间
>(查询:字符串):对象[TProtocol][TSpace]{return call('getObject',query);};
TypeScript抛出错误
类型“TSpace”不能用于索引类型“OBJECT[TProtocol]”。
如何修复它



p.S.VSCode可以理解我想要什么:

constp1s1=getObject('p1s1');
常量p2s1=getObject('p2s2');

它知道,
p1s1
{a:string}
p2s1
{c:number}

您必须使
TSpace
的类型依赖于
TProtocol
的类型。实现这一目标的一种方法是:

function getObject<
    TProtocol extends PROTOCOL,
    TSpace extends keyof OBJECT[TProtocol]
>(query: string): OBJECT[TProtocol][TSpace]
函数getObject< TProtocol扩展了协议, t空间扩展对象的键[TProtocol] >(查询:字符串):对象[TProtocol][TSpace]