打字稿:Return `typeof class` 的`实例类型`
Typescript: Return the `instance type` of the `typeof class`
我有一个功能,当你输入 Class name
或 Class constructor
时,它会 return 那个 Class:
的实例
type ConstructorOf<C> = { new (...args: any[]): C; };
const ClassMap = {
'Class1': Class1,
'Class2': Class2,
};
function getInstance<Cls>(c: ConstructorOf<Cls>): Cls;
function getInstance<N extends keyof typeof ClassMap>(key: N): typeof ClassMap[N]; // It return typeof Class1/Class2
function getInstance<N extends keyof typeof ClassMap, Cls>(key: N | ConstructorOf<Cls>) {
if (typeof m === 'string') {
return CreateInstance(ClassMap[key]);
}
return CreateInstance(key);
}
getInstance
的第二个定义不是我想要的,因为它 return 是 typeof Class
而不是 Class
这部分应该怎么修改?
您可以只使用 InstanceType
内置条件类型:
function getInstance<Cls>(c: ConstructorOf<Cls>): Cls;
function getInstance<N extends keyof typeof ClassMap>(key: N): InstanceType<typeof ClassMap[N]>;
function getInstance<N extends keyof typeof ClassMap, Cls>(key: N | ConstructorOf<Cls>) {
return null!
}
let o = getInstance("Class1"); // Class1
我有一个功能,当你输入 Class name
或 Class constructor
时,它会 return 那个 Class:
type ConstructorOf<C> = { new (...args: any[]): C; };
const ClassMap = {
'Class1': Class1,
'Class2': Class2,
};
function getInstance<Cls>(c: ConstructorOf<Cls>): Cls;
function getInstance<N extends keyof typeof ClassMap>(key: N): typeof ClassMap[N]; // It return typeof Class1/Class2
function getInstance<N extends keyof typeof ClassMap, Cls>(key: N | ConstructorOf<Cls>) {
if (typeof m === 'string') {
return CreateInstance(ClassMap[key]);
}
return CreateInstance(key);
}
getInstance
的第二个定义不是我想要的,因为它 return 是 typeof Class
而不是 Class
这部分应该怎么修改?
您可以只使用 InstanceType
内置条件类型:
function getInstance<Cls>(c: ConstructorOf<Cls>): Cls;
function getInstance<N extends keyof typeof ClassMap>(key: N): InstanceType<typeof ClassMap[N]>;
function getInstance<N extends keyof typeof ClassMap, Cls>(key: N | ConstructorOf<Cls>) {
return null!
}
let o = getInstance("Class1"); // Class1