【问题标题】:How can I get the a json object of typescript object from monaco editor?如何从 monaco 编辑器获取 typescript 对象的 json 对象?
【发布时间】:2020-05-21 13:53:27
【问题描述】:

问题: 我需要将使用intellisense的打字稿模型从extraLibs(摩纳哥编辑器中的选项)从摩纳哥编辑器转换为json对象,以便我可以将其发送到API进行处理。

您可以将以下代码复制并粘贴到 Monaco Editor Playground 以进行进一步测试

// extra libraries
monaco.languages.typescript.typescriptDefaults.addExtraLib('enum Types {type1 = 1,type2 = 2} interface Page {name: string;type: Types;}', 'ts:filename/facts.d.ts');

var jsCode = `
// This is typescript model which user can edit in the monaco editor
var model: Page = {
    name: "Page",
    type: Types.type1
}


// I need above typescript model in JSON form to send it to API like below
/*
{
    "name": "Page",
    "type": 1
}
 */
`;

monaco.editor.create(document.getElementById("container"), {
    value: jsCode,
    language: "typescript"
});

// I was trying something
monaco.languages.typescript.getTypeScriptWorker().then(x => {
    x('').then(y => {
        y.getEmitOutput('hello').then(z => {
            console.log(z)
        });
    })
})

注意:我在 Angular 中工作

【问题讨论】:

    标签: json angular typescript monaco-editor


    【解决方案1】:

    您可以使用getValue() 获取编辑器中的最后一个文本。然后你必须使用 typescript compiler services api 将其转换为 javascript 代码

    示例

    const jsCode = `var model: Page = {
        name: "Page",
        type: Types.type1
    }
    `
    
    const container = document.getElementById('container');
    
    require.config({ paths: { 'vs': 'https://unpkg.com/monaco-editor@0.8.3/min/vs' }});
    window.MonacoEnvironment = { getWorkerUrl: () => proxy };
    
    let proxy = URL.createObjectURL(new Blob([`
    	self.MonacoEnvironment = {
    		baseUrl: 'https://unpkg.com/monaco-editor@0.8.3/min/'
    	};
    	importScripts('https://unpkg.com/monaco-editor@0.8.3/min/vs/base/worker/workerMain.js');
    `], { type: 'text/javascript' }));
    
    require(["vs/editor/editor.main"], async function () {
    
    const libCode = `enum Types {
    type1 = 1,
    type2 = 2
    }
    
    interface Page {
    name: string;
    type: Types;
    }`
    
    monaco.languages.typescript.typescriptDefaults.addExtraLib(libCode, 'ts:filename/facts.d.ts');
    
    	let editor = monaco.editor.create(container, {
    		value: jsCode,
    		language: 'typescript',
    		theme: 'vs-dark' 
    	});
      	
      const result = window.ts.transpileModule(libCode + editor.getValue(), { compilerOptions: { module: window.ts.ModuleKind.CommonJS }});
      console.log(result);
    
      
    });
    html, body, #container {
    	position: absolute;
    	left: 0;
    	top: 0;
    	width: 100%;
    	height: 100%;
    	margin: 0;
    	padding: 0;
    	overflow: hidden;
    }
    <script src="https://unpkg.com/monaco-editor@0.20.0/min/vs/loader.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/typescript/3.9.3/typescript.js"></script>
    <div id="container"></div>

    【讨论】:

    • 输出不是我需要的。 Json 应该像我在问题中所说的那样。 Types.type1 的值为 1
    • 那么你必须实现你自己的 typescript-ish 转译器,它评估 enums to literal values as currently it is not supported
    • 实际上我们可以使用 JSON.stringify(typscriptObject) 来获取 JSON,但我不确定我们如何运行该函数并根据需要获取输出。
    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多