Microsoft/TypeScript

Access base class protected methods in static block

Open

#62,738 创建于 2025年11月9日

在 GitHub 查看
 (6 评论) (0 反应) (0 负责人)TypeScript (6,726 fork)batch import
BugDomain: classesHelp Wanted

仓库指标

Star
 (48,455 star)
PR 合并指标
 (平均合并 2天 7小时) (30 天内合并 8 个 PR)

描述

🔍 Search Terms

  • Dynamic method override
  • Static block super
  • Static block prototype

✅ Viability Checklist

⭐ 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

Example: https://www.typescriptlang.org/play/?ssl=25&ssc=2&pln=1&pc=1#code/MYGwhgzhAECyCeBhcVoG8BQ1oAcBOA9gC4CmwpAJtALbywlEAWBFAFAJTpbbQD0v0AHTCIBaiWggCAcwCWwbgF8MyjKEgwEAERJ5ZANxIVkG6CQAepAHYVNSFBEzZ8xMpWgFDePRQm16TCwcXDx8AsKC0KLi0GAUFLJEsgRWYCCSMvLc2BAArji6gv4MzGzsShjcEERgScAhPEyyEIIuRMTwBUV0JSzQALzQAGa5VuTJVqxNEABccPA6eobGDpxOoWFCwlFiEnEJSSlpGXIK2Tx5BXjdAaXB-FH5utCjvup4RtBEEABMAGx-AAMlQ28xMUFahHaRE6JBuvQogmAaRAU0YzXYAG5NlZiLEQFIAO6fb4-AAsZL+II2rAQ4JabQ6BViMDAVng7HhgURyIJaIxmwAKuiYISCHgANYwABGuSI0GaLysEDAQxI52wtPsGkhxCZezsiwMRnpnOK3KRKP5EE4D2FirFkplcoVMFGKrV52U2GUiiAA

贡献者指南