参数是联合,返回类型限于该联合的子集

时间:2019-05-10 17:00:56

标签: typescript

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

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”类型中必需

我还有其他方法可以实现这里的目标吗?

1 个答案:

答案 0 :(得分:2)

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

function buildAThing<T extends AllowedTypes>(ctor: T): InstanceType<T> {
    return new ctor() as InstanceType<T>;
}

Demo