我不明白为什么最后一行将泛型类型从[{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!;