Typescript 参数是一个并集,返回类型被约束为该并集的子集

Typescript 参数是一个并集,返回类型被约束为该并集的子集,typescript,Typescript,我想要一个函数,它接受一组有限的构造函数(与超类无关),并返回给定类型的对象: class Foo { name: string } class Bar { age: number } type AllowedTypes = typeof Foo | typeof Bar; function buildAThing(constructor: AllowedTypes) { return new constructor(); } 这个函数接受一个Foo或Bar,我希望返回

我想要一个函数,它接受一组有限的构造函数(与超类无关),并返回给定类型的对象:

class Foo { name: string }
class Bar { age: number }

type AllowedTypes =
    typeof Foo
  | typeof Bar;

function buildAThing(constructor: AllowedTypes) {
    return new constructor();
}
这个函数接受一个Foo或Bar,我希望返回类型与实际传递的内容相匹配

我知道我可以用重载来描述这一点:

function buildAThing(constructor: typeof Foo): Foo;
function buildAThing(constructor: typeof Bar): Bar;
function buildAThing(constructor: AllowedTypes) {
    return new constructor();
}
但是,我希望能够让其他函数调用此函数,而不必重新声明此其他函数中的每个重载

这样写会产生一个错误:

function usesBuildAThing(constructor: AllowedTypes) {
    return buildAThing(constructor);
}
“AllowedTypes类型的参数不能分配给'typeof Bar'类型的参数。”。 类型“typeof Foo”不可分配给类型“typeof Bar”。 类型“Foo”中缺少属性“age”,但类型“Bar”中需要属性“age”


是否有其他方法可以实现我在这里所追求的目标?

您需要使用泛型来明确指定返回类型:

function buildAThing<T extends AllowedTypes>(ctor: T): InstanceType<T> {
    return new ctor() as InstanceType<T>;
}
函数构建(ctor:T):实例类型{ 返回新的ctor()作为InstanceType; }

您需要使用泛型来明确指定返回类型:

function buildAThing<T extends AllowedTypes>(ctor: T): InstanceType<T> {
    return new ctor() as InstanceType<T>;
}
函数构建(ctor:T):实例类型{ 返回新的ctor()作为InstanceType; }

你是个英雄。谢谢你是个英雄。谢谢