当前位置: 首页 > 知识库问答 >
问题:

如何从匿名类扩展接口

闻人栋
2023-03-14

假设我有注释类:

const AnonymousClass = class {}
let a: typeof AnonymousClass;

如何从它扩展接口?编译器在这方面失败:

interface I extends typeof AnonymousClass {

}

游乐场链接:https://www.typescriptlang.org/play/#src=const匿名类=类{} let a: typeof匿名类; 接口I扩展类型的匿名类{

共有1个答案

家志学
2023-03-14

您不能在扩展实现子句中使用表达式,但您可以创建类型别名并改用它。您甚至可以使用与匿名类const相同的名称,因为它们位于不同的空间中(值空间与类型空间)

const AnonymousClass = class {
    static staticField = 0;
    instanceField = 0;
}

let a: typeof AnonymousClass;
type AnonymousClass = typeof AnonymousClass
interface I extends AnonymousClass {

}
let foo: I;
foo.instanceField // invalid
foo.staticField // valid

上面的代码扩展了类的静态接口,你可能想要扩展类的实例接口,你可以用一个额外的 InstanceType 条件类型来做:

const AnonymousClass = class {
    static staticField = 0;
    instanceField = 0;
}

let a: typeof AnonymousClass;
type AnonymousClass = InstanceType<typeof AnonymousClass>
interface I extends AnonymousClass {

}

let foo: I;
foo.instanceField // valid
foo.staticField // invalid

游乐场链接

 类似资料:
  • 问题内容: 匿名类如何扩展超类或实现接口? 问题答案: 匿名类 必须 像其他Java类一样扩展或实现某些东西,即使它只是just 。 例如: 这里是实现的匿名类的对象。 匿名类可以使用相同的语法扩展另一个类: 您无法实现的是实现多个接口。您需要一个命名类来做到这一点。但是,匿名内部类和命名类都不能扩展多个类。

  • 问题内容: 我想创建一个扩展另一个类的匿名内部类。 实际上,我要执行的操作如下: 这可能吗? 问题答案: 您不能给匿名类命名,这就是为什么它被称为“匿名”的原因。我看到的唯一选择是从您的外部范围引用变量 另一个选择是像这样定义一个本地类(不是匿名类): 如果您还需要更多,请创建一个常规类…

  • 我以为我对自己正在做的事情有很好的把握,但每当我觉得我对某事有很好的把握时,我被证明是错的:) 当我不在匿名类中时,我可以简单地执行 有人能解释为什么我可以调用方法,但不能在intent参数中使用吗?

  • 问题内容: 我正在寻找一个小的功能,该功能允许我从文件名中删除扩展名。 我通过谷歌搜索发现了许多示例,但是它们很糟糕,因为它们只是用“。”删除了字符串的一部分。。他们使用点作为限制器,只是剪切字符串。 看这些脚本, 要么 当我们添加这样的字符串时: 这是字符串的例子 它将仅返回“ This” … 该扩展名可以包含3个或4个字符,因此我们必须检查点是否位于4或5个位置,然后将其删除。 怎么做到呢?

  • 问题内容: 有这样的事情: 抽象类: 和扩展器: 我想要的是扩展,因为如果不处理它,然后尝试在中处理它。例如add- 但同时让类处理默认值,例如。 这是完全错误的方法吗? 到目前为止,我所做的就是添加一个接口。通常: 在课堂上: 在课堂上: 这看起来像是可用的设计吗? 并且,主要问题: 有没有什么好办法扩展该类,以便可以使用与in 中相同的切换方法?我想知道的是,有没有一个更好的设计,第二个是是否

  • 问题内容: 我有两节课:和。后者声明为: 我需要的只是类中的方法(仅在其中,因为会有很多继承的类,而且我不想在所有这些类中都实现此方法),它将从静态调用返回类名。这是我在说的: 当我称它为: 但是父类中的每个声明只能访问父类变量,该变量的值为“ Action”。 有什么可行的方法吗? 问题答案: 总是返回使用该类的类的名称,因此使用静态方法并没有太大帮助。如果该方法不是静态的,则可以简单地使用ge