是否可以在TypeScript中使用`extends`或`implements`强制构造函数参数类型?

问题描述 投票:1回答:1

我看了以下所有内容:

  1. Abstract constructor type in TypeScript
  2. How does `type Constructor<T> = Function & { prototype: T }` apply to Abstract constructor types in TypeScript?
  3. Abstract Constructor on Abstract Class in TypeScript

第三个是最接近我正在寻找的,但(不幸的是)答案更多的是针对特定问题而不是问题标题。

这是(简化意义上)我希望能够做到的事情:

abstract class HasStringAsOnlyConstructorArg {
  abstract constructor(str: string);
}

class NamedCat extends HasStringAsOnlyConstructorArg {
  constructor(name: string) { console.log(`meow I'm ${name}`); }
}

class Shouter extends HasStringAsOnlyConstructorArg {
  constructor(phrase: string) { console.log(`${phrase}!!!!!!`); }
}

const creatableClasses: Array<typeof HasStringAsOnlyConstructorArg> = [NamedCat, Shouter];
creatableClasses.forEach(
  (class: typeof HasStringAsOnlyConstructorArg) => new class("Sprinkles")
);

在上面的示例中,您可以看到Shouter和NamedCat都使用一个字符串作为其构造函数。它们不一定需要扩展类,它们可以实现接口或其他东西,但我真的希望能够保存一个类列表,这些类需要构造完全相同的参数。

是否可以在TypeScript中使用extendsimplements强制类构造函数参数类型?

编辑:“可能重复”似乎显示如何在界面中使用new()为此目的。也许还有其他方法。

typescript types constructor abstract
1个回答
0
投票

您可以对数组本身执行此类强制执行,因此它将仅允许具有单个字符串参数的构造函数:

class NamedCat {
    constructor(name: string) { console.log(`meow I'm ${name}`); }
}

class Shouter {
    constructor(phrase: string) { console.log(`${phrase}!!!!!!`); }
}

type ConstructorWithSingleStringArg = new (args: string) => any;

const creatableClasses: Array<ConstructorWithSingleStringArg> = [NamedCat, Shouter];
creatableClasses.forEach(
    ctor => new ctor("Sprinkles")
);

Playground

© www.soinside.com 2019 - 2024. All rights reserved.