- Notifications
You must be signed in to change notification settings - Fork 13k
Description
When you've got a bit of inheritance going on, there can be limits to what you can do with method chaining. Say you've got these two classes:
class Animal { public sleep() : Animal { return this; } } class Elephant extends Animal { public squirtWithTrunk(): Elephant { return this; } }
Given an instance of Elephant, you could do this:
myElephant.squirtWithTrunk().sleep()
but you couldn't do this:
myElephant.sleep().squirtWithTrunk()
Because Animal doen't have a "squirtWithTrunk" method.
Seems fair enough, but given how much code space method chaining can save, and how much that can matter in JavaScript, it's a shame. And obviously in raw JavaScript this sort of thing just works.
If the following syntax were allowed, and "this" could be passed through a method chain without its type being narrowed to ancestor types, I think that might be quite nice:
class Animal { public sleep() : this { } } class Elephant extends Animal { public squirtWithTrunk(): this { } }
I don't know how feasible that would be from a compiler point of view, but as a user of the language I'd find it very useful. In the last code snippet I imagine that the return statement would be disallowed, and that the returned value would always be the current object.