在我的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
。
如果你想要一些没有这两个限制的东西,那么它将会变得更加复杂。它适用于您给出的用例。