【问题标题】:Hinting abstract classes in TypeScript在 TypeScript 中提示抽象类
【发布时间】:2020-07-08 12:00:25
【问题描述】:

我有一个类数组,所有这些类都是从一个基本抽象类扩展而来的。如果您能原谅糟糕且过度使用的 OO 抽象:

abstract class Animal {
  abstract speak(): string;
}

class Dog extends Animal {
  speak(): string {
    return "woof... sigh"
  }
}

class Cat...

我有一个封装了所有这些实现的数组:

const all = [Cat, Dog];

我想告诉 TypeScript,这个数组中的所有内容在构造时都会返回一个作为 Animal 实例的类。

重要的是要注意这是传递类,而不是对象,因此这将是无效的,因为类本身不继承自抽象。

const all : Array<Animal> = [Cat, Dog]

不幸的是,我似乎在文档中找不到关于通过 new 关键字进行类型提示的任何内容。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    我们想要声明一个值,当用new 调用它时,会返回一个Animal。写成这样:

    new() => Animal
    

    注意与函数类型的相似性 (() =&gt; Animal)。

    那么完整的代码是:

    const all: Array<new() => Animal> = [Cat, Dog];
    

    或者,为了清楚起见使用界面:

    interface AnimalConstructor {
        new(): Animal;
    }
    
    const all: AnimalConstructor[] = [Cat, Dog];
    

    【讨论】:

    • 只要不扩展 dog 或 cat 类,这将起作用。一旦这些类被扩展,它们将与 Animal 的签名不匹配。
    • 谢谢!这完美!我也无意进一步扩展摘要 Budhead,但感谢您的提前警告!
    【解决方案2】:

    你应该可以这样做:

    const all: (typeof Animal)[] = [Cat, Dog]
    

    【讨论】:

    • 我想指出,您可能需要发送extend Animal 才能使其正常工作
    • 谢谢!缺少extends Animal 是我的一个拼写错误 此更改已经解决了类型提示问题,但可能太好了:P TypeScript 现在认为从该数组创建一个实例等于尝试从一个抽象类创建一个实例,而不是而不是承认我只是想用那个界面来实例化一些东西。
    • 您应该能够通过 new (all[0] as typeof Cat)() 转换到正确的类
    • 但是这种方法有点违背了打字系统的目的。对我来说,这听起来有点像这种在数组中包含类的解决方案是一种次优方法。可能有更优雅的解决方案可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2016-06-29
    • 2022-01-02
    相关资源
    最近更新 更多