我试图通过索引从类型中获取函数的返回类型,其中索引是泛型类型变量。
代码:
enum PROTOCOL { P1 = 0, P2 = 1 };
enum PROTOCOL_P1_SPACE { S11 = 0, S12 = 1 };
enum PROTOCOL_P2_SPACE { S21 = 0, S22 = 1 };
type OBJECT = {
[PROTOCOL.P1]: {
[PROTOCOL_P1_SPACE.S11]: { a: string },
[PROTOCOL_P1_SPACE.S12]: { b: Array<number> },
},
[PROTOCOL.P2]: {
[PROTOCOL_P2_SPACE.S21]: { c: number },
[PROTOCOL_P2_SPACE.S22]: { d: Buffer },
},
};
function getObject<
TProtocol extends PROTOCOL,
TSpace extends PROTOCOL_P1_SPACE | PROTOCOL_P2_SPACE
>(query: string): OBJECT[TProtocol][TSpace] { return call('getObject', query); };
TypeScript引发错误Type 'TSpace' cannot be used to index type 'OBJECT[TProtocol]'.
如何解决?
P.S。 VSCode可以理解我想要的:
const p1s1 = getObject<PROTOCOL.P1, PROTOCOL_P1_SPACE.S11>('p1s1');
const p2s1 = getObject<PROTOCOL.P2, PROTOCOL_P2_SPACE.S21>('p2s2');
了解,p1s1
是{ a: string }
,而p2s1
是{ c: number }
答案 0 :(得分:1)
您必须使TSpace
的类型取决于TProtocol
的类型。实现此目的的一种方法是这样的:
function getObject<
TProtocol extends PROTOCOL,
TSpace extends keyof OBJECT[TProtocol]
>(query: string): OBJECT[TProtocol][TSpace]