, ( , ), .
, , , , (, ):
class Base<T> {
constructor(props: T) {}
}
type BaseConstructor<C extends Base<P>, P> = {
new(props: P): C;
}
interface AProps {}
class A extends Base<AProps> {}
interface BProps {
x: number;
y: number;
}
class B extends Base<BProps> {}
interface CProps {
str: string;
ok?: boolean;
}
class C extends Base<CProps> {}
function createClassFactory<C extends Base<P>, P> (MyClass: BaseConstructor<C, P>) {
return function classFactory(props: P) {
return new MyClass(props);
}
}
let a1 = createClassFactory(A)({});
let b1 = createClassFactory(B)({ x: 3, y: 5 });
let c1 = createClassFactory(C)({ str: "stirng" });
let c2 = createClassFactory(C)({ str: "stirng", ok: true });
let b2 = createClassFactory(B)({ x: 3, y: "5" });
let c3 = createClassFactory(C)({ ok: true });
let a2 = createClassFactory(A)({ key: "value" });
( )
- , a2 .
, , .