Access base class protected methods in static block
#62738 opened on Nov 9, 2025
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