使用typescript编译器时如何解决uninterpreted statement问题api?
How to solve uninterpreted statement problems when using typescript compiler api?
我正在尝试注入一个模块
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)]
)
)]
)
以下代码被发送到 es5 的原因...
import module from './module'
module()
...但此代码不...
import module from './module'
...是因为在发出时,编译器将删除其标识符未在表达式中使用的所有导入声明(使用 tsc
尝试该代码,您将看到此行为)。
见"Why are imports being elided in my emit?"
解决方案
解决方案是在表达式中使用其中一个导入的标识符,或者注入一个导入声明,该声明只导入模块以产生副作用:
// import "./module";
let importInject = ts.createImportDeclaration(
undefined,
undefined,
undefined,
ts.createLiteral(moduleName));
我正在尝试注入一个模块
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)]
)
)]
)
以下代码被发送到 es5 的原因...
import module from './module'
module()
...但此代码不...
import module from './module'
...是因为在发出时,编译器将删除其标识符未在表达式中使用的所有导入声明(使用 tsc
尝试该代码,您将看到此行为)。
见"Why are imports being elided in my emit?"
解决方案
解决方案是在表达式中使用其中一个导入的标识符,或者注入一个导入声明,该声明只导入模块以产生副作用:
// import "./module";
let importInject = ts.createImportDeclaration(
undefined,
undefined,
undefined,
ts.createLiteral(moduleName));