如何在Monaco编辑器中定义全局变量以实现智能感知?

3

我已经整合了 Monaco 编辑器,用于编写简单的代码片段。

我希望在这些代码片段中全局使用 TypeScript 变量,并使其具有可行的智能提示功能。

我正在使用以下代码加载 TypeScript 类型:

 const typings = await fetch(path).then(r => r.text());
 monaco.languages.typescript.javascriptDefaults.addExtraLib(typings, path);

但是显然,如果没有任何额外的措施,它将无法运行。因为TypeScript Typings被创建为模块,并且不会向全局公开任何内容。

我可以使用以下代码创建一个全局变量:

monaco.languages.typescript.javascriptDefaults.addExtraLib(`
  declare const typescript: any;
`, 'global.d.ts');

但是我无法为这个变量分配 typescript 类型。我尝试了以下内容

 monaco.languages.typescript.javascriptDefaults.addExtraLib(typings, './typescript.d.ts');

 monaco.languages.typescript.javascriptDefaults.addExtraLib(`
   import * as ts from './typescript.d.ts';

   declare global {
     const typescript: typeof ts;
   }
 `, 'global.d.ts');
 });

但是没有运气。它不起作用。

如何将模块公开为全局变量?

2个回答

6
我不熟悉Monaco集成,但是当我将代码手动添加到TypeScript项目中时,会出现错误:“导入路径不能以'.d.ts'扩展名结尾。考虑改为导入'./typescript'。”更改后,我可以使用typescript全局变量。
然而,这种方法只能让你访问typescript中的常量和函数,而无法访问类型,例如typescript.SourceFile。要获取它,请尝试以下操作:
monaco.languages.typescript.javascriptDefaults.addExtraLib(`
  import * as ts from './typescript';
  export = ts;
  export as namespace typescript;
`, 'global.d.ts');

或者,直接对TypeScript类型文件进行猴子补丁:

monaco.languages.typescript.javascriptDefaults.addExtraLib(
  typings + "\nexport as namespace typescript;", path);

0

那也可以用纯JS实现

///---Webpack.cfg.js---
var fs = require('fs');
var MonacoEditorPlugin = require('monaco-editor-webpack-plugin')

...plugins.push(
          new MonacoEditorPlugin({            
            languages: ['typescript', 'javascript', 'css', 'html', 'json', 'less']
            /// typescript - Require !
          })
        )

let MYDTS = [
    fs.readFileSync('./globals.d.ts'),
    fs.readFileSync('./src/js/RuntimeDeclare.d.ts'),//some modules 
    'declare function myFunc(modulename:String): String;', //inline
   ]
    .join(';\n')
    .replace(/export declare/g, 'declare')
    .replace(/export interface/g, 'interface')
    .replace(/export type/g, 'type');// 'export'is not recognize, so remove
    //import won't work, you need to do it in expanded form

//---In front js---
// validation settings
monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({
    noSemanticValidation: true,
    noSyntaxValidation: false
});

// compiler options
monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
    target: monaco.languages.typescript.ScriptTarget.ES6,
    allowNonTsExtensions: true,
    allowJs: true,//!!!Require for js
});

monaco.languages.typescript.javascriptDefaults.addExtraLib(
    MYDTS, 'ts:filename/MYDTS.d.ts');

monaco.editor.create(....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接