-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Description
π Search Terms
- Dynamic method override
- Static block super
- Static block prototype
β Viability Checklist
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This isn't a request to add a new utility type: https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- This feature would agree with the rest of our Design Goals: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
β Suggestion
Hey there, I have a use case where I want to declare/override a protected method using it's prototype.
With the addition of static blocks I can now override the method itself, however I can't call the same method of the base class using super. This makes it impossible to create dynamic overrides of a prototype method atm.
My suggestion would be to allow the usage of the base type prototypes in a static block of the class as well.
This would make it a lot easier to dynamically override/declare a method without using instance fields.
π Motivating Example
TypeScript now supports dynamic method overrides using static initialization blocks instead of runtime checks.
π» Use Cases
1. What do you want to use this for?
Dynamic method declarations / overrides
Dynamic class creation using an options object.
2. What shortcomings exist with current approaches?
Currently the only way I see to do this is either:
- Use as any/ which destroys type information
- Use as DerivedType which allows the call with type information
- Always override the method and call the additional method in an if branch which usually requires an instance field
- Declare the method on an instance field instead of the prototype which uses more memory
- Use @ts-ignore because you know what you are doing
3. What workarounds are you using in the meantime?
- I use (Base.prototype as DerivedType).myMethod which imho is the best solution atm