javascript - typescript编译后是否可以保留原来的函数头

标签 javascript typescript

通常可以通过以下方式查看函数信息:

function somefunction(arg1, { a, b, c}){}

someFunction.toString()

...编译并运行

//function somefunction(arg1, { a, b, c}){}

但是当 typescript 编译代码时,任何可能具有解构参数的函数都会被替换为 _a:

function someOtherFunction(arg1, { a, b, c}){}

console.log(someOtherFunction.toString())

...编译并运行

//function someOtherFunction(arg1, _a){}

是否有办法在仍然使用 typescript 的同时检索原始解构的参数信息?

我在 TS 问题跟踪器中进行了深入研究,但在许多问题中迷失了方向。然而,初步搜索似乎没有什么结果。

编辑 由于我尝试使用 ts-node 执行此操作,因此解决方案是更改目标和模块,如下所述:https://github.com/TypeStrong/ts-node/issues/678 。这有效地保证了编译后的代码是es6代码,不会剥离解构!

谢谢大家!

最佳答案

运行Function.prototype.toString()总是打印出已编译的javascript,因此它取决于您的目标,因为这会改变它的编译方式。没有可以更改的设置,因为这是一个功能运行时 javascript,Typescript 在编译时不会对其产生任何影响。

举这个简单的例子:

function someFunction(
    arg1: string,
    { a, b, c }: {a: string, b: string, c: string}
){}
alert(someFunction.toString())

如果目标是 ES5 或更低版本,解构赋值不可用。因此,编译器可以在不假设环境支持的情况下进行重组分配。它通过改变你的论点来完成同样的事情来做到这一点。

Example with ES3 target (click Run)

Example with ES2015 target (click Run)

<小时/>

因此,您可以通过更改目标来“修复”此问题,但是您的目标环境最好支持解构。但是,如果您进行编译以支持较旧的环境,则调用 toString() 将始终返回编译为在目标环境中工作的函数体。

关于javascript - typescript编译后是否可以保留原来的函数头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57663405/

相关文章:

javascript - 根据 promise 的结果抛出错误

javascript - 在 pip 上单独搜索

javascript - JQuery.getJSON() 读取本地文件

javascript - 通过状态栏选择并删除与下一个元素合并

typescript - 如何在 TestCafe 中全局处理错误

Angular2 @HostListener 在派生组件中不起作用

typescript - Azure函数: Can't figure out which ctor to call

javascript - 在 Javascript 逻辑中访问 EJS 变量

angular - tslint no-var-keyword - "forbidden ' var' 关键字的目的是什么?

javascript - 如何阻止 VS 2013 生成 TypeScript 映射文件