我如何与现有的 JS 对象互操作?

How can I interop with existing JS objects?

我正在尝试编写 Dart 代码来生成一个粗略的等价物:

var disposable = vscode['commands'].registerCommand(
    'extension.sayHello',
    function () {
        vscode['window'].showInformationMessage('Hello World!');
    }
);
context.subscriptions.push(disposable);

变量 vscodecontext 都是 JavaScript 中可用的全局变量,它正在执行我的 Dart(正在使用 Dart Dev 编译器编译为 JS)。

我很高兴 context/vscode 现在完全没有类型,但我正在努力弯曲 JS package 输出这样的代码(例如,如果我把 @JS()在存根 vscode 上,我得到 dart.global.vscode).

你可以使用基础dart:js features

请注意 context 恰好是 dart 在 javascript 上下文中的名称。

var disposable = context['vscode']['commands'].callMethod('registerCommand', [
    'extension.sayHello',
    () {
        context['vscode']['window'].callMethod('showInformationMessage', ['Hello World!']);
    }]);
);
context['context']['subscriptions'].callMethod('push', [disposable]);

让我在 github 和 package:js 上举一个简单的例子。

编辑:好的,开始吧: https://github.com/matanlurey/js-interop-examples

我尝试了几次 package:js 语法正确(我们可能需要更多文档和示例),但我最终创建了一个 "fake" visual studio 代码 API (vscode.js),并且可以很好地互操作。

请注意,如果您希望您的示例在 Dartium 中运行,则需要使用 allowInterop 包装您的函数。