TypeScript: TypeScript does not set function name for MethodDeclarations
This issue has been asked as a question on StackOverflow.
I have a TypeScript class, and I’m doing some metaprogramming where I need to be able to access instance.func.name
, however TypeScript omits the function name in the compiled JS.
TypeScript:
class ClassName {
// ...
func(): ReturnType {
// ...
}
}
Compiled JavaScript:
// ...
ClassName.prototype.func = function () {
// ...
};
Desired JavaScript:
ClassName.prototype.func = function func() {
// ... ^^^^
};
Not sure if this is a bug or by design, but the source of the result is emitter.ts.
A proposed solution on StackOverflow was:
// src/compiler/emitter.ts:4671
function shouldEmitFunctionName(node) {
if (node.kind === 173 /* FunctionExpression */) {
// Emit name if one is present
return !!node.name;
}
if (node.kind === 213 /* FunctionDeclaration */) {
// Emit name if one is present, or emit generated name in down-level case (for export default case)
return !!node.name || languageVersion < 2 /* ES6 */;
}
// MODIFIED
if (node.kind === 143 /* MethodDeclaration */) {
return true;
}
}
About this issue
- Original URL
- State: closed
- Created 9 years ago
- Reactions: 10
- Comments: 18 (10 by maintainers)
Bump
Hello, are there any updates on this issue? According to the latest activity above (on 8/31/2017), it was supposed to be added to TypeScript 2.6 but it isn’t there in it. Also, if it’s not too late, I would like to suggest that the name should include the class name as well (ClassName$functionName, for example). In large projects where the same function is used by several classes (for example when overriding a function from a base class), the function name alone isn’t sufficient to uniquely identify the actual function. It would be even better if there was a way to control the prefix.
Is this planned for version 2.3 now? It really ruined the day for my test framework and will be loved when it comes.
That just means we’re not downleveling the method declaration. The issue is for the downleveling targets.