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

19 浏览
0 Comments

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

如果我以常规方式声明一个类,我可以将类名用作类型:

class Foo {
  foo: number
  constructor(x: number) {
    this.foo = x
  }
}
let foo : Foo // 一切正常

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

const Bar = class Bar {
  bar: string
  constructor(x: string) {
    this.bar = x
  }
}
let b: Bar // 'Bar'指的是一个值,在这里被当作类型使用。你是不是想要 'typeof Bar'?

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

[typescript playground example](https://www.typescriptlang.org/play?#code/MYGwhgzhAEBiD29oG8BQ1oDNEC5oDsBXAWwCMBTAJ3WmHnwgBdLDhH5KAKADzyLKoBKFDQyMAFgEsIAOmxIAvNG40AvqnWo6DRtABCYStCWhIMA0bQZShvE0qT8Acxrb7rdl17R7jp8KsMaAlpGRsjJRUMdU0Qcl0waDwERQJyAHc4RE4AFgAmQVQ43VIk-UNjNMyLTgAicXIQEHha4QB6NuhxeEyAEyQASVoOSnI2EABPaF6x8FHghuCJgAdyaHhMaFIAflRUTEJ8Nkl6aGWHfEYANTAQQnIUznlkxGE8ADd4SV6RDDd4OIyZpOJ6IOSvDR7A5HRgnfBnC7XW73GrhMoWALQDrQdLiMC6aQLNZ0SijNhLVbTWaGfFwrpUci7P70CAA8hA+Ag8JhQyFTSoc6OJF3B7ZMCFQWXG4i1GCIA)

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

原因

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

[Here's that example with a single line added showing the problem again](https://www.typescriptlang.org/play?noImplicitAny=false&strictPropertyInitialization=false#code/PTAEAEGcBcCcEsDG0AKsD2AHApraBPASQDt5p4BDAG3gC8Lz1iAuUAM2smwCgQJj0hALaYaiMgEFi+Vhypdu8YtFwdE2UAGEq6RAGtNTGLACuydLFABvbqFDFsAd1AAKABboTsVsRNCARrgANKBCSiYqPn6BsACUrNq6eiQqsGrYANzcAL7cisqqFOpaOvophcU2duT6LvGgAG7o8AAmWbnciEbQJUkJpQbdpuaWALygiFQUkJC9+qDwIlTYQtjKs4llBWlFGlUTQ2bQFu5RAcGhZzGx1rnVSHp11rZ2B8SQ6MsAdDoA5i4AIkC2EwoGBmABsSydly2Sy3GWPUQoH6SVA4wczk2jwAzEEAEwABliQA)

0
0 Comments

在Typescript中,有两个命名空间,一个是值空间,一个是类型空间。类声明会在声明的上下文中同时在值空间和类型空间中添加一个名称。而类表达式只会在类作用域中添加这些名称。这意味着你可以在类中将BarExpression用作构造函数和类型。在封闭的作用域中,你只能使用const命名的Bar作为构造函数,但是类型不会添加到封闭的作用域中。

你可以使用InstanceType条件类型来获取构造函数的实例类型。你还可以添加一个类型别名声明,以实现类声明类似的效果。

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

感谢!我刚刚在查看这里之前自己尝试了更多的东西,`type Bar = typeof Bar.prototype`似乎也可以正常工作。这是否等同于使用`InstanceType`?

`InstanceType` - 太棒了 - 这就是我在寻找的,谢谢!

0