javascript - 在 TypeScript 中从这个实例化?

标签 javascript typescript

我不确定这是否可能,但这是我正在努力实现的...

abstract class Animal<T> {
  breed(mate: Animal<T>) {
    return new [this kind of animal]()
  }
}

class Cat extends Animal<Cat>{
  
}


let cat1 = new Cat();
let cat2 = new Cat();
let kitten = cat1.breed(cat2);

这种事情是否可能,或者我是否需要为每种动物创建一个 breed 方法?

在 ES6 JS 中你可以使用 new this.constructor() 但在 Typescript 中这是不可能的:

abstract class Animal<T> {
  breed(mate: Animal<T>) {
    return new this.constructor()
  }
}

会报错:

this expression is not constructable.
Type 'Function' has no construct signatures.

最佳答案

(property) Object.constructor: FunctionFunction,在 typescript 中你不能在它上面做 newthis .constructor 未被 TypeScript 识别为构造函数类型的值,但您可以转换为 any 以获取新实例。在您的情况下,类似于以下内容-

abstract class Animal<T> {
  breed(mate: Animal<T>) {
    return new (<any>this.constructor);
  }
}

在 JavaScript 中,当与 new 一起使用时,每个函数都被视为构造函数,因此 JavaScript 代码可以正常工作,没有任何问题。

关于javascript - 在 TypeScript 中从这个实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63485248/

相关文章:

php - Magento - 半分页

javascript - 在 Javascript 中解析 int 的最佳方法

typescript - 以简单/缩小的方式定义类成员

typescript TS1005 : '{' expected

angular - 在 Angular2 的英雄之旅中找不到模块 './in-memory-data-service'

javascript - onClick 将文本字段值复制到下拉字段

javascript - Google 时间轴图表 - 将无持续时间的事件更改为圆圈

javascript - 使用 JavaScript 或 jQuery 检测互联网连接?

angular - 如何在 ionic 中更改选项卡时弹出所有选项卡堆栈?

javascript - 如何确保我的字符串在 typescript 中有两个单词