Функция стрелки TypeScript для изменения синтаксиса строки

#javascript #typescript #babeljs #eval #arrow-functions

#JavaScript #TypeScript #babeljs #Вычисление #стрелка-функции

Вопрос:

У JavaScript нет проблем, он видит анонимную функцию стрелки, и ее .toString() метод возвращает именно это.

 // This returns as expected
// ie `() => ""`
const t = [() => ""];
console.log(t[0].toString()); 

В этом примере используется Babel, но то же самое происходит в TypeScript. TypeScript видит анонимную функцию со стрелкой и пытается создать оператор анонимной функции, который недействителен при попытке запуска eval на нем.

 // This returns an incomplete function string
const t = [() => ""]
console.log(t[0].toString()); 

Запуск eval(t[0].toString()) вернет ошибку:

 SyntaxError: Function statements require a function name
 

Есть ли способ сохранить правильный синтаксис при использовании Babel / TypeScript? Есть ли какой-то другой лучший способ добиться этого?

Ответ №1:

Результирующая строка:

 function () { return ""; }
 

Это не может быть проанализировано должным образом, потому что, как говорится в прочитанной вами ошибке:

Для операторов функции требуется имя функции

 function () { return ""; } 

Без имени оно может существовать только в контексте выражения. Это работает, когда Babel не используется, потому что синтаксически разрешены автономные выражения функции стрелки, а автономные безымянные function выражения — нет.

Одним из способов было бы присвоить функцию переменной при вводе eval :

 var t = [function() { return "abc"; }]
var result = eval(`var fn = ${t[0].toString()}; fn();`);
console.log('result:', result); 

(Но вам также следует подумать, eval действительно ли это необходимо — во многих случаях его использование указывает на неэлегантное X-решение проблемы XY — подумайте, есть ли какой-либо способ реорганизовать ваш скрипт, чтобы избежать eval . Иногда eval это необходимо, но часто это не так.)