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

使用类表达式/值作为类型

常英毅
2023-03-14

如果我以通常的方式声明一个类,我可以使用类名作为类型:

class Foo {
  foo: number
  constructor(x: number) {
    this.foo = x
  }
}
let foo : Foo // all fine

但是,如果我通过将类表达式分配给变量来声明一个类,我就不能将该名称用作类型:

const Bar = class Bar {
  bar: string
  constructor(x: string) {
    this.bar = x
  }
}
let b: Bar // 'Bar' refers to a value, but is being used as a type here. Did you mean 'typeof Bar'?

建议使用typeof Bar不起作用,因为我想要Bar实例类型,而不是类本身的类型。

typescript操场示例

如何获取以第二种方式定义的类的实例类型?

我对以这种方式定义类感兴趣的原因是,我希望有一个接口来描述某些类将具有的静态方法,如此处的手册中所述(该部分中的第三个示例)。

下面是添加了一行的示例,再次显示了问题

共有1个答案

熊锐进
2023-03-14

类型脚本有两个名称空间,一个值空间和一个类型空间(在这里阅读更多)。类声明在值空间和声明它的上下文中的类型空间中都添加了一个名称。类表达式,只在类范围内添加这些。因此,您可以使用Bar表达式作为类内的构造函数和类型。

const Bar = class BarExpression {
  bar: BarExpression // Valid in the class
  constructor(x: BarExpression) { 
    this.bar = x
  }
}

在封闭范围中,您只剩下名为Bar常量,可以用作构造函数,但该类型没有添加到封闭范围中(const声明没有理由向封闭范围中添加类型)。

您可以使用InstanceType条件类型获取构造函数的实例类型。您还可以添加类型别名声明,以便获得与类声明类似的效果:

const Bar = class Bar {
  bar: string
  constructor(x: string) {
    this.bar = x
  }
}
type Bar = InstanceType<typeof Bar>
let a : Foo = new Foo(42)
let b : Bar = new Bar("hello")

游乐场链接

 类似资料:
  • 请考虑以下代码: 表达式、和是被丢弃的值表达式,根据C++标准草案N4659/[expr].12,我希望lvalue-to-rvalue将应用于这三种情况。对于情况(2),这将导致调用volatile复制构造函数()[expr]/12 [...]如果表达式在此可选转换后是prvalue,则应用临时物化转换([Conv.RVAL])。[注意:如果表达式是类类型的lvalue,则它必须有一个易失性的复

  • 我想在Protégé中为类表达式语法使用双值,但我找不到任何示例。所有使用的都是整数值,而不是double。例如:http://protegeproject.github.io/protege/class-expression-syntax/ 例如,我想用米来表示一个人的身高: HasHeight值1.89 HasHeight最小值1.70 我怎么能这么做? 当前的工作(根据语法):“hasHei

  • 我试图找到它,但没有结果。我希望对象具有bash脚本的路径和cron表达式,指定何时运行它。这是SpringBoot项目。我看到它是这样的: 可以做到吗?如果可以的话,请稍微指导我一下。

  • 这是我的实体类,映射到(9.4)中的一个表。我正在尝试将元数据存储为数据库中的类型 这是元数据类: 我使用以下迁移文件添加了列: 在中创建记录时出现此错误:错误:列“metadata”的类型为,但表达式的类型为提示:您需要重写或强制转换表达式。 这是我试图在db中持久化的请求主体: 请帮助如何转换类型为在javaSpring启动应用程序

  • 在Spring Boot的一个项目中,Java8使用hibernate-spatial和PostgresDB 9.4 应用程序属性 (我也尝试了PostgisPG9Dialect) 我的实体有一个属性 如果我用空值保存就可以了,但是如果我放一个值 我有: 在我的数据库中,我可以看到列定义为 我要疯了...为什么它不起作用? 更新(仍然不起作用,我正在收集新信息) 1)我认为问题可能是数据库的创建。

  • 问题内容: 我正在将此问题设置为“ FizzBu​​zz”,而我的switch语句给了我一些问题,这是我的代码: 如果您可以为我提供指针/提示,而不是给我正确的代码,那将是一件好事:D我宁愿自己解决它,但一些提示也可以使我摆脱困境。 问题答案: 您可以在单独检查它们之前使用并检查两者是否匹配: