class A {}
class B extends A {}
class C extends A {}
namespace D {
function NewInstance<T extends A = A>(iclass: T): T;
}
想要:删除 <T extends A>
并根据输入类自动确定返回类型。
D.NewInstance(B) => B
, D.NewInstance(C) => C
目前。如果我不设置通用。D.NewInstance(B) => A
, D.NewInstance(C) => A
去掉泛型函数声明中的默认类型,应该会让事情按照你的期望工作。
interface A { }
interface B extends A { }
function NewInstance<T extends A>(iclass: T): T {
return iclass
}
const a: A = {}
const b: B = {}
NewInstance(a) // return A
NewInstance(b) // return B
谢谢@Karthick Vinod,但是我的函数的参数是一个类。
回答我自己的问题。关键是util类型 type Newable<T> = new (...args: any[]) => T;
abstract class A {
a: number = 1;
abstract aa(): void;
}
class B extends A {
bb: number = 2;
aa(): void {}
}
class C extends A {
cc: number = 3;
aa(): void {}
}
type Newable<T> = new (...args: any[]) => T;
function NewInstance<T extends A>(iclass: Newable<T>): T {
return new iclass();
}
const a = NewInstance(A); // error, A is not newable
const b = NewInstance(B); // return B
console.log(b.a); // ok
console.log(b.bb); // ok
b.aa(); // ok
const c = NewInstance(C);
console.log(c.a);
console.log(c.cc);
c.aa();