|
|
|
|
|
by ryanwheale
1252 days ago
|
|
> you can call `this.constructor.staticMethod()` and it calls `staticMethod()` on `User` or up the inheritance chain. This is where I have come to like typescript. 4 years ago, I would have agreed with you, but TS have moved me into a world where I wouldn't write that kind of code any more, and it honestly makes me sick to look at. Instead I would just do `User.staticMethod` because this accomplishes several things: - super classes shouldn't know about inheriting classes. If they do, TS gives you interfaces and abstract classes for this purpose.
- it still crawls up the proto chain, so the inheriting class doesn't need to know about every super class
- no risk in `this` pointing to something unintentional (if someone calls or apply's your method)
- shorter code, easier to read IMO, especially for less experienced devs
|
|
super classes don't need to 'know' about the inheriting classes for static inheritance to work. i.e. here is a simplified problem in the library I'm trying to add types to:
superclass:
subclass: (it doesn't really look like that but you get the idea). That just works in JS, but in TS you get `Property 'hasField' does not exist on type 'Function'`. In the TS definition there are a couple of ways I can trick it to return the right thing for `this.constructor` but if I'm looking at a JS file in vscode with TS' checkJs flag on then this pattern should just work in my opinion.edit: And I don't think I should have to trick it, that makes the definition harder to read and essentially wrong somehow.