是否有一个快速的方法来转换表达式到他们的Javascript等效?



在我的Typescript转换器中,我从函数调用中获得CallExpression引用。

function myFunction(param: Record<string, any>){

}
const value1 = myFunction({hello: 'hello'});
const params = {hello: 'hello'}
const value2 = myFunction(params);

在这两个myFunction调用表达式中,我得到一个数组,其中我知道第一项是我想要的对象的Expression

在我开始解析表达式并尝试手动找出类型之前。有没有一种快捷的方式让我说:"给我这个表达式表示的JavaScript对象?">

还是我总是必须手动执行这些转换?

我想让{hello: 'hello'}进入变压器。

例子
// Ts code
myFunction({hello: 'hello'});

// Inside some part of the transformer
function convert(callExpression: ts.CallExpression): Record<string, string> {
const argumentExpression = callExpression.arguments[0];
// In this place I know `argumentExpression` exist and it is
// an `ObjectLiteralExpression` or a `Identifier`
// This should return {hello: 'hello'}
return someMagicTsFunction(argumentExpression);
}
const converted = convert(myCallExpression); // {hello: 'hello'}
// I can do what I want here with converted :) 

一种hack,但它似乎工作:获得节点的文本,然后通过eval()运行。

let foo: any;
eval('foo = ' + callExpression.arguments[0].getText());

如果以编程方式创建节点,getText()将失败,因为它试图获取源代码,而生成的节点没有源代码。根据您的用例,这可能无关紧要。

如果参数依赖于被求值的表达式,例如someFunction({a: getBar()}),那么这显然也不会工作,因为你的代码不会定义getBar

如果你想要一些没有这两个限制的东西,那么它将会变得更加复杂。它适用于您给出的用例。

相关内容

  • 没有找到相关文章

最新更新