我有一个构造函数,应该根据param返回不同的类型。
interface B {
hello(): string;
}
class Foo {
constructor(withB: boolean): Foo & B;
constructor();
constructor(withB?: boolean) {
if (withB) {
Object.assign(this, { hello() {}})
}
}
}
const foo1 = new Foo();
const foo3 = new Foo(true);
但它不起作用。我该怎么做?
答案 0 :(得分:2)
您无法直接定义此类。您可以定义常规类并将其重命名为FooImpl
并声明一个代表具有dirrent重载的构造函数的常量,并为其分配FooImpl
:
interface B {
hello(): string;
}
class FooImpl {
constructor(withB?: boolean) {
if (withB) {
Object.assign(this, { hello() {}})
}
}
}
const Foo : {
new(withB: boolean): FooImpl & B;
new() : FooImpl;
}= FooImpl as any;
const foo1 = new Foo(); // FooImpl
const foo3 = new Foo(true); // FooImpl & B
如果您的界面只有方法,您也可以使用泛型并在接口方法上指定this
参数,将其可见性限制为仅适用于该类型的某些参数:
interface B {
hello(): string;
}
class Foo<T=void> {
private withB: T;
constructor(withB: T) ;
constructor();
constructor(withB?: boolean) {
}
hello(this: Foo<boolean>): string {
return "";
}
}
const foo1 = new Foo();
foo1.hello() // Invalid
const foo3 = new Foo(true);
foo3.hello() // Valid