中的类的类型不可分配给类



下面是一些示例代码,我不明白它为什么会抛出错误。如有任何帮助,我们将不胜感激。我试图在getClass函数中创建一个类实例,但typescript抛出了一些Error。代码在javascript中运行,但我找不到修复typescript错误的方法。

它说"类型‘typeof Ab’不能赋值给类型‘Ab’。类型"typeof Ab"中缺少属性"b"。

class A {
public a: string
constructor(args: Partial<A>) {
this.a = args.a;
}
};
class Ab extends A {
public b: string
constructor(args: Partial<Ab>) {
super(args);
this.b = args.b;
}
};
class Ac extends A {
public c: string
constructor(args: Partial<Ac>) {
super(args);
this.c = args.c;
}
};
const enumMap = {
ab: 1 as 1,
ac: 2 as 2,
};
type enumMap = typeof enumMap[keyof typeof enumMap];
type enumClass<T extends enumMap> =
T extends typeof enumMap.ab ? Ab :
T extends typeof enumMap.ac ? Ac : never;
const enumClassMap: { [K in enumMap]: enumClass<K> } = {
[enumMap.ab]: Ab, //Error
[enumMap.ac]: Ac, //Error
}
function getClass<T extends enumMap>(type: T) {
let abc: { new(): enumClass<T> } = enumClassMap[type];
return new abc({});
};
getClass(enumMap.ac);

问题是enumClassMap需要Ab和Ac:类的对象

const enumClassMap: { [K in enumMap]: enumClass<K> } = {
[enumMap.ab]: new Ab({a: "a", b: "b"}), //Error
[enumMap.ac]: new Ac({a: "a", c: "c"}), //Error
}

我认为这应该是你的问题的正确输入:

type enumClass<T extends enumMap> = T extends typeof enumMap.ab ? typeof Ab 
: T extends typeof enumMap.ac ? typeof Ac : never;
function getClass<T extends enumMap>(type: T) {
let abc: (new (args: any) => Ab | Ac) = enumClassMap[type];
return new abc({a: "a"});
};

更新:

这将是键入示例的另一个示例。但我不知道为什么演员阵容是必要的。索引类型的类型推断似乎存在一些问题。

class A {
public a: string;
constructor(args: Partial<A>) {
this.a = args.a;
}
}
class Ab extends A {
public b: string;
constructor(args: Partial<Ab>) {
super(args);
this.b = args.b;
}
}
class Ac extends A {
public c: string;
constructor(args: Partial<Ac>) {
super(args);
this.c = args.c;
}
}
enum enumMap {
Ab = 1,
Ac
}
type enumClass<T extends enumMap> = T extends typeof enumMap.Ab
? Ab
: T extends typeof enumMap.Ac ? Ac : never;
interface ConstructorOf<T extends enumMap> {
new (args: any): enumClass<T>;
}
const enumClassMap: { [T in enumMap]: ConstructorOf<T> } = {
[enumMap.Ab]: Ab,
[enumMap.Ac]: Ac
};
function getClass<T extends enumMap>(type: T) {
return new enumClassMap[type]({a: "a"}) as enumClass<T>;
}
getClass(enumMap.Ac);

相关内容

最新更新