art*_*.sw 56 constructor types class typescript
我如何声明一个class类型,以便我确保该对象是一个通用类的构造函数?
在下面的例子中,我想知道我应该给哪种类型,AnimalClass以便它可以是Penguin或Lion:
class Animal {
constructor() {
console.log("Animal");
}
}
class Penguin extends Animal {
constructor() {
super();
console.log("Penguin");
}
}
class Lion extends Animal {
constructor() {
super();
console.log("Lion");
}
}
class Zoo {
AnimalClass: class // AnimalClass could be 'Lion' or 'Penguin'
constructor(AnimalClass: class) {
this.AnimalClass = AnimalClass
let Hector = new AnimalClass();
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这种class类型不起作用,无论如何它都太普遍了.
art*_*.sw 51
来自typescript接口的解决方案参考:
interface ClockConstructor {
new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
tick();
}
function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
return new ctor(hour, minute);
}
class DigitalClock implements ClockInterface {
constructor(h: number, m: number) { }
tick() {
console.log("beep beep");
}
}
class AnalogClock implements ClockInterface {
constructor(h: number, m: number) { }
tick() {
console.log("tick tock");
}
}
let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);
Run Code Online (Sandbox Code Playgroud)
所以前面的例子变成了:
interface AnimalConstructor {
new (): Animal;
}
class Animal {
constructor() {
console.log("Animal");
}
}
class Penguin extends Animal {
constructor() {
super();
console.log("Penguin");
}
}
class Lion extends Animal {
constructor() {
super();
console.log("Lion");
}
}
class Zoo {
AnimalClass: AnimalConstructor // AnimalClass can be 'Lion' or 'Penguin'
constructor(AnimalClass: AnimalConstructor) {
this.AnimalClass = AnimalClass
let Hector = new AnimalClass();
}
}
Run Code Online (Sandbox Code Playgroud)
gap*_*ton 15
像那样:
class Zoo {
AnimalClass: typeof Animal;
constructor(AnimalClass: typeof Animal ) {
this.AnimalClass = AnimalClass
let Hector = new AnimalClass();
}
}
Run Code Online (Sandbox Code Playgroud)
要不就:
class Zoo {
constructor(public AnimalClass: typeof Animal ) {
let Hector = new AnimalClass();
}
}
Run Code Online (Sandbox Code Playgroud)
typeof Class是类构造函数的类型.它比自定义构造函数类型声明更可取,因为它正确处理静态类成员.
如何声明类类型,以确保该对象是通用类的构造函数?
构造函数类型可以定义为:
type AConstructorTypeOf<T> = new (...args:any[]) => T;
class A { ... }
function factory(Ctor: AConstructorTypeOf<A>){
return new Ctor();
}
const aInstance = factory(A);
Run Code Online (Sandbox Code Playgroud)
我不确定最初问这个问题时在TypeScript中是否可行,但是我的首选解决方案是使用泛型:
class Zoo<T extends Animal> {
constructor(public readonly AnimalClass: new () => T) {
}
}
Run Code Online (Sandbox Code Playgroud)
这样就可以变量penguin并lion推断具体类型Penguin,Lion甚至可以推断出TypeScript智能感知。
const penguinZoo = new Zoo(Penguin);
const penguin = new penguinZoo.AnimalClass(); // `penguin` is of `Penguin` type.
const lionZoo = new Zoo(Lion);
const lion = new lionZoo.AnimalClass(); // `lion` is `Lion` type.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
79917 次 |
| 最近记录: |