Nie można używać dekoratorów TypeScript, ponieważ function.name
to readonly property.
Jest hacky way:
class ClassName {
// ...
public func = function test() {
}
public func2() {
}
}
let instance = new ClassName();
console.log("RESULT", instance.func['name']);
ale to nie jest dokładnie to, o co prosisz (tj zauważyć brakujące prototyp w deklaracji funkcji).
Edit: maszynopis kompilator nie pisać nazwę funkcji, ponieważ nie ma dla SyntaxKind.MethodDeclaration
manipulacja w emitter.ts:
function shouldEmitFunctionName(node: FunctionLikeDeclaration) {
if (node.kind === SyntaxKind.FunctionExpression) {
// Emit name if one is present
return !!node.name;
}
if (node.kind === SyntaxKind.FunctionDeclaration) {
// Emit name if one is present, or emit generated name in down-level case (for export default case)
return !!node.name || languageVersion < ScriptTarget.ES6;
}
}
Jeśli chcesz dostać w swoje ręce brudne, potem można zaktualizować ./node_modules/typescript/lib/typescript.js
pliku. Wystarczy dodać ostatni warunek:
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;
}
}
i uruchomić to, aby przetestować zmiany:
$ node ./node_modules/typescript/lib/typescript.js hello.ts
dość sprytnego rozwiązania – robsonrosa