Как решить проблемы с неинтерпретируемым оператором при использовании машинописного компилятора api? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь внедрить модуль
оператор импорта с помощью transformer.ts

(* Я использовал ttypescript, и он работает,
Но некоторые операторы не интерпретируются.)

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

Это код, который я использовал в transfomer.

transformer.ts

let moduleName = 'infinite.js'
let variableName = ts.createUniqueName('infinite')
ctx.hoistVariableDeclaration('infinite')

// Here are just a few key codes summarised.
let importInject = ts.createImportDeclaration(
    undefined,
    undefined,
    ts.createImportClause(variableName, undefined),
    ts.createLiteral(moduleName))

sourceFile = ts.updateSourceFileNode(sourceFile, ts.createNodeArray([
    importInject,
    ...sourceFile.statements
]))

source.js

// Nothing before it.

source.js (вставленный оператор импорта)

import infinite_1 from"infinite.js"

Внедрение кода работало нормально,
Несмотря на то, что целевой параметр компилятора определил es5,

Но у вставленного мной кода возникла проблема, которая не переводилась.

Однако, еслиЯ добавляю оператор импорта, что
не имеет никакого отношения к коду импорта модуля

Я добавлю исходный код перед внедрением модуля,
перевод вставленного мной кода также выполнен успешно.

source.js

import module from './module'
module()

source.js (вставленный оператор импорта)

"use strict";
exports.__esModule = true;
var infinite_js_1 = require("infinite.js");
var module_1 = require("./module");
module_1["default"]();

Хмм ... это проблема с опцией компиляции ...?
Если это так, какие опции компиляции следует изменить?
Я не знаю, какой код изменить ... (x_x)

У кого-нибудь когда-нибудь возникала такая проблема?
Если вы знаете решение, пожалуйста, дайте мне знать.


Кроме того, в настоящее время я использую временное решение, как показано ниже.

let importInject = 
ts.createVariableStatement(
    sourceFile.modifiers, 
    [ts.createVariableDeclaration(
        variableName, 
        undefined, // Type
        ts.createCall(
            ts.createIdentifier('require'), 
            undefined,
            [ts.createLiteral(moduleName)]
        )
    )]
)

1 Ответ

0 голосов
/ 31 декабря 2018

Причина, по которой следующий код отправляется в es5 ...

import module from './module'
module()

... но этот код не ...

import module from './module'

... состоит в том,потому что во время генерации компилятор удалит любые объявления импорта, чьи идентификаторы не используются в выражении (попробуйте этот код с tsc, и вы увидите это поведение).

См. "Почемуимпортируется ли мой emit? "

Решение

Решение состоит в том, чтобы использовать один из импортированных идентификаторов в выражении или внедрить объявление импортакоторый импортирует модуль только для побочных эффектов:

// import "./module";
let importInject = ts.createImportDeclaration(
    undefined,
    undefined, 
    undefined,
    ts.createLiteral(moduleName));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...