【问题标题】:Is it possible to enforce constructor parameter types with `extends` or `implements` in TypeScript?是否可以在 TypeScript 中使用 `extends` 或 `implements` 强制构造函数参数类型?
【发布时间】:2018-09-16 03:49:08
【问题描述】:

我查看了以下所有内容:

  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】:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2021-02-07
    相关资源
    最近更新 更多