You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Monaco Editor中为JS/TS添加全局对象以支持智能提示与代码检查

解决方案:注册全局data对象并基于JSON Schema提供智能提示

要实现你需要的三个需求,核心是利用Monaco Editor内置的TypeScript语言服务处理全局变量的类型提示和错误检查,无需手动实现各类Provider。以下是具体步骤和代码示例:

1. 将JSON Schema转换为TypeScript类型定义

Monaco的JS语言服务依赖TypeScript类型信息生成智能提示。你需要把JSON Schema转换成TS全局变量声明。比如你的JSON Schema是:

{
  "type": "object",
  "properties": {
    "user": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "age": { "type": "number" }
      },
      "required": ["name"]
    },
    "config": {
      "type": "object",
      "properties": {
        "theme": { "type": "string", "enum": ["light", "dark"] }
      }
    }
  }
}

对应的TS类型声明字符串为:

declare global {
  const data: {
    user: {
      name: string;
      age?: number;
    };
    config?: {
      theme?: 'light' | 'dark';
    };
  };
}
export {};

你可以手动编写,也可以用json-schema-to-typescript工具自动转换(代码中直接调用转换函数即可)。

2. 在React中配置Monaco Editor

以@monaco-editor/react库为例,初始化时添加类型定义:

import React from 'react';
import Editor from '@monaco-editor/react';
import * as monaco from 'monaco-editor';

// JSON Schema对应的TS类型声明
const DATA_TYPE_DECLARATION = `
declare global {
  const data: {
    user: {
      name: string;
      age?: number;
    };
    config?: {
      theme?: 'light' | 'dark';
    };
  };
}
export {};
`;

function App() {
  const handleEditorDidMount = (editor, monacoInstance) => {
    // 添加类型定义为额外库,让TS服务识别全局data变量
    monacoInstance.languages.typescript.javascriptDefaults.addExtraLib(
      DATA_TYPE_DECLARATION,
      'file:///data.d.ts' // 虚拟文件路径,用于标识该库
    );

    // 启用类型检查,消除未定义错误
    monacoInstance.languages.typescript.javascriptDefaults.setDiagnosticsOptions({
      noSemanticValidation: false,
      noSyntaxValidation: false,
    });
  };

  return (
    <Editor
      height="80vh"
      language="javascript"
      defaultValue="// 试试输入d,会提示data\nconsole.log(data.user.name)"
      onMount={handleEditorDidMount}
    />
  );
}

export default App;

3. 关键API说明(理清你之前的困惑)

  • addExtraLib:核心方法,通过添加额外TS类型定义文件,让Monaco的TS语言服务自动处理全局变量的提示、类型检查和错误消除,无需手动实现其他Provider。
  • CompletionItemProvider:用于自定义补全逻辑(如特定关键词补全),但此处用TS服务自动补全更高效,无需手动实现。
  • DocumentSymbolProvider:用于生成文档符号大纲(如编辑器左侧的变量/函数列表),与智能提示无关。
  • DeclarationProvider:用于实现「跳转到定义」功能,TS服务已基于你添加的类型定义自动支持。

4. 动态更新Schema的处理

若JSON Schema动态变化,只需重新调用addExtraLib传入更新后的类型声明:

// Schema变化时
const updatedTypeDeclaration = generateTypeDeclarationFromNewSchema(newSchema);
monacoInstance.languages.typescript.javascriptDefaults.addExtraLib(updatedTypeDeclaration, 'file:///data.d.ts');

以上配置可完全满足你的需求:输入'd'时自动提示data,子属性按JSON Schema结构展示,同时消除data未定义的错误提示。

内容的提问来源于stack exchange,提问作者Justine Gagnepain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:50:26