带节点的内存中的Transpile TypeScript

时间:2015-02-25 21:20:22

标签: javascript node.js typescript code-translation

有没有办法使用Node在内存中转换TypeScript?我希望能够在内存中获得生成的JavaScript。

2 个答案:

答案 0 :(得分:8)

是的,您可以使用TypeScript-Simple:

https://github.com/teppeis/typescript-simple

var tss = require('typescript-simple');
var js = tss('var n: number = 1;');
console.log(js); // 'var n = 1;'

答案 1 :(得分:3)

我们最终基于原生的TypeScript transpileModule 功能开发了我们自己的解决方案。

来自TYPESCRIPT DOCS

TranspileModule将从'输入'编译源文本。使用指定编译器选项的参数如果没有提供选项 - 它将使用一组默认编译器选项。此函数将无条件使用的额外编译器选项包括:

  • isolatedModules = true
  • allowNonTsExtensions = true
  • noLib = true
  • noResolve = true

transpile() - 此代码会将TypeScript转换为JavaScript(需要TypeScript中的typescriptServices.min.js):

export function transpile(tscode: string): TYPE.EVENT {

    interface TranspileOptions {
        compilerOptions?: any
        fileName?: string;
        reportDiagnostics?: boolean;
        moduleName?: string;
        renamedDependencies?: any;
    }

    interface TranspileOutput {
        outputText: string;
        diagnostics?: any[];
        sourceMapText?: string;
    }

    let compilerOptions: ts.CompilerOptions = {
        isolatedModules: false
    }

    let options: TranspileOptions = {
        compilerOptions: compilerOptions,
        reportDiagnostics: true
        // moduleName: modulename
    }

    let info: TYPE.EVENT;

    try {

        // Transpile the ts code to js.
        let ret: TranspileOutput = ts.transpileModule(tscode, options);

        // If diagnostics were returned.
        // NOTE: The transpiler is currently always return a message (code=5047) about 'isolatedModules', which
        // is not relavent for our use. If there is more than one row than there is in fact an error.
        if (ret.diagnostics && ret.diagnostics.length > 0) {

            let code = ret.diagnostics[0].code;

            if (code == 5047) {
                return (info = {
                    success: true,
                    returnvalue: ret.outputText,
                    caller: LibCore.getFunctionName(arguments)
                })
            } else {

                let text = ret.diagnostics[0].messageText;
                // let hint = ret.diagnostics[0].file.parseDiagnostics[0].file.nextContainer.symbol.name;

                return (info = {
                    success: false,
                    returnvalue: ret.diagnostics,
                    message: `Syntax error: ${text} Code: ${code}`,
                    caller: LibCore.getFunctionName(arguments)
                })
            }

        } else {
            return (info = {
                success: true,
                returnvalue: ret.outputText,
                caller: LibCore.getFunctionName(arguments)
            })
        }

    } catch (e) {
        return (info = {
            success: false,
            message: e.message,
            caller: LibCore.getFunctionName(arguments)
        })
    }
}