Typescript has two name spaces, a value space and a type space (read more here). A class declaration adds a name in both value space and type space in the context where it is declared. A class expression, only adds these in the class scope. So you can use BarExpression
as both the constructor and the type inside the class.
const Bar = class BarExpression {
bar: BarExpression // Valid in the class
constructor(x: BarExpression) {
this.bar = x
}
}
In the enclosing scope, you are only left with the const
named Bar
that you can use as the constructor, but the type in not added to the enclosing scope ( const declaration has no reason to add a type to the enclosing scope).
You can get the instance type of a constructor using the InstanceType
conditional type. And you can also add a type alias declaration, in order so get a similar effect to a class declaration:
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")
CLICK HERE to find out more related problems solutions.