【问题标题】:Cannot destructure property "subscriptions of "undefined" - vscode extension无法解构属性“未定义”的订阅 - vscode 扩展
【发布时间】:2022-01-03 15:58:36
【问题描述】:

我正在编写一个 vscode 扩展,它采用文档的语言并基于该语言生成一个 hello world 模板。我已经生成了一个状态栏图标,但也没有显示出来。这是我的第一个扩展,所以我对这一切都很陌生。当我使用 Control + Shift + P 运行命令时,它也会收到一个错误,即找不到该命令。

代码...

import * as vscode from 'vscode';
import "typescript";
import "./constants";

let myStatusBar : vscode.StatusBarItem;

export function activate(context: vscode.ExtensionContext, { subscriptions }: vscode.ExtensionContext) {
    const codeBoilerplateCommand = 'code-boilerplate.CodeBoilerplate';
    subscriptions.push(vscode.commands.registerCommand(codeBoilerplateCommand, () => {
        const documentFileType = vscode.window.activeTextEditor?.document.languageId;
        const documentFileName = vscode.window.activeTextEditor?.document.fileName;
        const documentFilePath = vscode.window.activeTextEditor?.document.fileName.split('/');

        vscode.window.showInformationMessage("Generating your Code Boilerplate... ⌛")
        if (documentFileType === "javascript") {
            vscode.window.activeTextEditor.edit(editBuilder => {
                editBuilder.insert(new vscode.Position(0, 0), 'console.log("Hello World!")');
            });
        }
        else if (documentFileType === "python") {
            vscode.window.activeTextEditor.edit(editBuilder => {
                editBuilder.insert(new vscode.Position(0, 0), 'print("Hello World!")');
            });
        }
        else if (documentFileType === "typescript") {
            vscode.window.activeTextEditor.edit(editBuilder => {
                editBuilder.insert(new vscode.Position(0, 0), 'console.log("Hello World!");');
            });
        }
        else if (documentFileType === "csharp") {
            vscode.window.activeTextEditor.edit(editBuilder => {
                editBuilder.insert(new vscode.Position(0, 0), 'using System;');
                editBuilder.insert(new vscode.Position(3,0), 'namespace' + documentFileName + ' {');
                editBuilder.insert(new vscode.Position(6,4), 'class HelloWorld {');
                editBuilder.insert(new vscode.Position(9, 8), 'static void Main(string[] args) {');
                editBuilder.insert(new vscode.Position(12,12), 'Console.WriteLine("Hello World!");');
                editBuilder.insert(new vscode.Position(14,8), '}');
                editBuilder.insert(new vscode.Position(15, 4), '}');
                editBuilder.insert(new vscode.Position(16, 0), '}');
            });
        }
        else if (documentFileType === "c") {
            vscode.window.activeTextEditor.edit(editBuilder => {
                editBuilder.insert(new vscode.Position(0,0), '#include <stdio.h>');
                editBuilder.insert(new vscode.Position(1,0), 'int main() {');
                editBuilder.insert(new vscode.Position(2,4), 'printf("Hello World!");');
                editBuilder.insert(new vscode.Position(3,4), 'return 0;');
                editBuilder.insert(new vscode.Position(4,0), '}');
            })
        }
        else if (documentFileType === "cpp") {
            return null;
        }
        else if (documentFileType === "java") {
            return null;
        }
    }));

    myStatusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100);
    myStatusBar.command = codeBoilerplateCommand;
    subscriptions.push(myStatusBar);

    subscriptions.push(vscode.window.onDidChangeActiveTextEditor(updateStatusBarItem));
    subscriptions.push(vscode.window.onDidChangeTextEditorSelection(updateStatusBarItem));
    updateStatusBarItem();
}

function updateStatusBarItem(): void {
    myStatusBar.text = `$(new-file) Hello World!`;
    myStatusBar.show();
}

export function deactivate() {
    myStatusBar.dispose();
}

【问题讨论】:

  • 似乎未定义的对象作为激活函数的第二个参数传入。检查传入的内容。
  • 非常感谢
  • 您在哪里看到activatecontext 之后接受了第二个参数?
  • 上下文:vscode.ExtensionContext 导致错误 - 已删除,一切正常。感谢您的帮助。
  • 您可能希望将其保留为export function activate(context: vscode.ExtensionContext) 并在函数主体中引用context.subscriptions - 以防您将来可能需要访问ExtensionContext 的其他属性。

标签: typescript visual-studio-code vscode-extensions


【解决方案1】:

你的函数原型不正确,activate 只接受一个参数。要访问订阅,请执行以下操作:

export function activate(context: ExtensionContext) {
    context.subscriptions.push(...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2019-10-11
    相关资源
    最近更新 更多