-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
allow decorators for functions #7318
Comments
@Aleksey-Bykov it was discussed in here #2249 (comment) |
Please note that decorator proposal is undergoing churn now, and we would not be adding new features until we have a stable proposal. |
@mhegazy just fyi that function expression decorators are at stage 0: https://github.com/tc39/proposals/blob/master/stage-0-proposals.md And while the underlying implementation is undergoing some churn, the syntax has been stable for quite a while. It would be great to have this implemented behind a flag because angular users could then write tests with a much nicer syntax.
compared to the current:
|
Any progress ? This will be really powerful feature. There is a lot of use cases. Related discussion: |
This could potentially solve #10644 - it's a nasty side-effect when trying to use using bound methods feature with decorators :-( |
My understanding of this issue is: My crude paraphrasing of the above is: Do they offer conciseness? No. Do they enable expressing anything that is not better expressed with factories? Not for me. Do they offer compositional approaches aside from unmaintainable 5+ class deep hierarchies? No. Do the enable composition over inheritance? No. (ignoring all the lessons learned in C++, C#, Java) Do they encourage depending on implementation? Yes! Do they provide encapsulation? No. The Maximally Minimal appraoch fell flat on its face. The only reason to use classes is to use decorators, the feature has been proposed to make up for how worthless they are. |
Wow, that was a fast 3 👎. I am not saying decorators should not be allowed on functions. Again Maximally Minimal approach to decorators is what leads that feature to be insufficiently generalizable to other constructs. |
Is this even possible? I saw a discussion on Babel about this and they ended up with impossibility to implement decorators on function because of their hoisting. Is hoisting acceptable in TypeScript? (I don't know because I've never used that) |
I beg, do not give up +1 |
The standardization effort of function decorators has been moved to https://github.com/iddan/proposal-function-expression-decorators . The decorator of function declarations and the hoisting problem is discussed in No. 3 issue. |
Is there any news on this? Looks like nothing really changed in the last year or so. |
AFAIU this is still blocked by the lack of JavaScripts ability to do that. |
Hi there! For some reason, this plugin can only be used with |
If the argument is that this will break hoisting, GOOD THEN. I hate hoisting anyways 😆 Jokes aside, the fact that decorators can only be used on classes is totally arbitrary. Everything is possible. Even a dangling decorator are technically possible to implement. This thread is more like convincing the right people to actually make it happen. |
Any updates on this? This will be a very valuable feature |
@bal1anD Just check yourself:
The proposal is still stage 0. It builds upon the decorator porposal, which is still only stage 2. Don't expect this anytime soon. |
Using decorators in functions! Why? |
@menocomp: well, in that case, why introduce decorators in TS at all? All of their use-cases can be solved by higher-order functions? The reason is elegance, clean-code. |
@bal1anD not only that but some people find this feature useful |
This would be helpful as well |
I agree, we shouldn't care about "syntax sugars" which introduce layer over layer over layer just to reduce negligible amount of additional characters typed. And I certainely don't think introducing new constructs to the language actually makes code "elegant" and "clean". Usually it makes code shorter, but often tradeoff is that code becomes harder to reason and learnng curve is getting steeper and we all know too "smart" short code is no good. Imagine Junior programmer reading code top-down. I bet such person won't know how decorators work, when they are executed etc. They're not self-explanatory like higher-order functions which you understand quickly when you grasp that function can return function. Decorators feel a bit like "magic" and that's it for dozens of juniors. But the core problem here is with additional value provided by decorators in TypeScript via experimentalDecorators and emitDecoratorMetadata flags for classes, which is very useful and good reason to use them. For example ability to obtain metadata about function parameter types provided by compiler to the runtime. I don't think such feature is currently possible without "Class" construct. From my perspective this is what makes current state of TypeScript favor OOP over Functional Paradigm, especially when it comes to solving problem of dependency injection conviniently, which is an extremely important one. |
Decorators for function would be extremely useful for react, so instead of this:
We could have just
|
|
I think this could be done using a hack aft first anonymous functions could not be supported so let's stick with functions and suppose we have this function: @logger
function fetchData() {
await fetch('resource')
} logger actually will not be a class or method decorator to avoid dealing with descriptors, instead of that it will be a higher order function as the following: function logger(target) {
return (...args) {
// do whatever you want
return target(...args)
}
} when typescript compile the code it should output something like this: function fetchData() {
logger()
// ...other decorators
return _fetchData();
} I think this could be a start |
Auch hacks are explicitly out of scope for TypeScript. |
did a quick search, it looks like this hasn't been yet requested
currently decorators can only be added to classes, methods and properties
consider allowing them on functions too
The text was updated successfully, but these errors were encountered: