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

时间:2019-01-18 15:59:25

标签: typescript typescript-typings

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

代码:

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 }

1 个答案:

答案 0 :(得分:1)

您必须使TSpace的类型取决于TProtocol的类型。实现此目的的一种方法是这样的:

function getObject<
    TProtocol extends PROTOCOL,
    TSpace extends keyof OBJECT[TProtocol]
>(query: string): OBJECT[TProtocol][TSpace]