检查泛型类型是否为数组

时间:2020-10-20 20:04:47

标签: typescript generics types

我不明白为什么最后一行将泛型类型从[{Constructor1: typeof Constructor1}, {Constructor2: typeof Constructor2}]转换为RunnerTokensMap
因此,转换后,类型同时是数组,而不是数组。

type Constructor<T extends {} = {}, A extends any[] = any[]> = new (...args: A) => T;
type ConstructorsWithTokens = Record<string, Constructor>;
type ConstructorsWithTokensMap = ConstructorsWithTokens | Array<ConstructorsWithTokens>;
type ConstructorByToken<C extends ConstructorsWithTokensMap, T extends string | Constructor> = 
        C extends Array<any> ? 1 : 2;

export function getByToken<
    C extends ConstructorsWithTokensMap,
    T extends string,
>(construct: C, token: T): ConstructorByToken<C, T> {
    return null as any;
}

class Constructor1 { method1(): void {} }
class Constructor2 { method2(): void {} }

let constructor1 = getByToken([{Constructor1}], 'Constrructor1') // Type: "1" OK!;
let constructor2 = getByToken([{Constructor1, Constructor2}], 'Constrructor1') // Type: "1" OK!;
let constructor3 = getByToken([{Constructor1}, {Constructor2}], 'Constrructor1') // Type: "1 | 2" Not OK!;

Playground Link

0 个答案:

没有答案