如何禁用单个Monaco编辑器语法规则

时间:2018-09-12 11:10:42

标签: javascript typescript monaco-editor

我有一个用例,其中有一个允许用户编写自定义函数的monaco编辑器。此功能必须采用格式

function (source, callback) {
    callback(source);
}

因为我们然后将输出分配给一个变量,用于运行数据。

但是,我收到“期望的标识符”错误。有没有办法禁用此单一语法规则?

The error

3 个答案:

答案 0 :(得分:1)

但这不是Monaco编辑器语法规则!

这是JavaScript错误!您会收到此错误,因为如果您这样编写它:

function (source, callback)
{
    callback(source);
}

那么您将无法使用此功能!

您必须这样写它:

function funcName(source, callback)
{
    callback(source);
}

仅,如果您将此函数用作此处的参数:

anotherFunction(function(source, callback)
{
    callback(source);
});

您可以写没有名字的东西。或者,如果您立即使用它,如下所示:

(function(source, callback)
{
    callback(source);
})('Hello, world!', alert);

答案 1 :(得分:0)

在相同的情况下,我想允许在全局级别使用return语句,因为我的脚本是一个“函数”。 Typescript使用“'return'语句只能在函数体内使用”来将返回标记为错误。

我发现的一个解决方案是过滤模型标记。由于字符串匹配,这真是太糟糕了,但是它可以工作。装饰出现后,UI中会出现轻微闪烁,然后立即消失。

创建编辑器后,订阅装饰更改:

   this.editor.onDidChangeModelDecorations( e => this.onDidChangeModelDecorations(e) )

在何处获取当前标记,对其进行过滤,然后将其放回编辑器中:

onDidChangeModelDecorations(e: monaco.editor.IModelDecorationsChangedEvent)
{
    let model = this.editor.getModel()
    let markers = monaco.editor.getModelMarkers( { owner:'typescript', resource: model.uri} )

    // We have to filter out the error that the editor gives on global returns.
    // Unfortunately the error code is null in the marker, so we have option but to 
    // match on the text of the error.
    // It will be obvious if this regresses.
    let filtered = markers.filter( marker => marker.message != "A 'return' statement can only be used within a function body." )
    if (filtered.length != markers.length)
    {
        monaco.editor.setModelMarkers(model, 'typescript', filtered)
    }
}

希望我们将来至少可以得到匹配的错误代码。 标记中可能包含更多信息,您可以更好地对其进行过滤,看看调试器中的标记对象。

答案 2 :(得分:0)

同时,引入了适当的API以忽略某些错误。这应该可以解决上述错误肯定的问题:

monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({
    diagnosticCodesToIgnore: [1003]
});