我想要一个函数,该函数采用一组有限的构造函数之一(与超类无关),并返回给定类型的对象:
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”类型中必需
我还有其他方法可以实现这里的目标吗?
答案 0 :(得分:2)
您需要使用泛型来明确指定返回类型:
function buildAThing<T extends AllowedTypes>(ctor: T): InstanceType<T> {
return new ctor() as InstanceType<T>;
}