我有一个函数,该函数接收数组或Typescript类的其余部分,并将解析并返回其实例。
但是,我无法正确键入它。
如果我提取一个:
class Base {
isBase = true;
}
class Foo extends Base {
isFoo = true;
}
class Bar extends Base {
isBar = true;
}
export interface BaseType<Se extends Base = Base> {
new (...args: any[]): Se;
}
function unwrap<T extends Base>(baseType: BaseType<T>): T {
return new baseType();
}
unwrap(Foo).isFoo;
它可以工作并且正确键入,返回正确的类型。但是,如果我有它们的数组,那是行不通的:
function unwrapAll<T extends Base>(...baseType: BaseType<T>[]): T[] {
return baseType.map(b => new b());
}
const [foo, bar] = unwrapAll(Foo, Bar);
console.log(foo.isFoo, bar.isBar);
我知道Typescript有一些关于this的消息,但是我仍然找不到解决方法!
我找到了一种通过使用重载来管理它的方法,但是它的作用有限
function unwrapAll<T0 extends Base>(bT0: BaseType<T0>): [T0];
function unwrapAll<T0 extends Base, T1 extends Base>(bT0: BaseType<T0>, bT1: BaseType<T1>): [T0, T1];
function unwrapAll<T0 extends Base, T1 extends Base, T2 extends Base>(
bT0: BaseType<T0>,
bT1: BaseType<T1>,
bT2: BaseType<T2>
): [T0, T1, T2];
function unwrapAll<T0 extends Base, T1 extends Base, T2 extends Base, T3 extends Base>(
bT0: BaseType<T0>,
bT1: BaseType<T1>,
bT2: BaseType<T2>,
bT3: BaseType<T3>
): [T0, T1, T2, T3];
function unwrapAll<T extends Base>(...baseType: BaseType<T>[]): T[] {
return baseType.map(b => new b());
}
答案 0 :(得分:2)
最近在3.1中可以使用mapped tuples
class Base {
isBase = true;
}
class Foo extends Base {
isFoo = true;
}
class Bar extends Base {
isBar = true;
}
export interface BaseType<Se extends Base = Base> {
new (...args: any[]): Se;
}
type UnwrapAll<T extends Array<BaseType<Base>>> ={ [P in keyof T]: T[P] extends BaseType<infer U> ? U : never}
function unwrapAll<T extends Array<BaseType<Base>>>(...baseType: T): UnwrapAll<T> {
return baseType.map(b => new b()) as any;
}
const [foo, bar] = unwrapAll(Foo, Bar);
console.log(foo.isFoo, bar.isBar);