在 vscode JavaScript 中设置全局声明

Posted

技术标签:

【中文标题】在 vscode JavaScript 中设置全局声明【英文标题】:Set global declaration in vscode JavaScript 【发布时间】:2019-11-13 22:49:13 【问题描述】:

我正在开发一个 javascript 转译器,除了其他东西之外,它还会在构建时替换某些函数和变量。

例如以下文件(./src/my-module.js):

defineModule("MyModule", function(exports) 
  return exports;
);

将被复制并转换为(./build/my-module.js):

(function(global, factory) 
  "use strict";
  if (typeof exports !== "undefined" && typeof module !== "undefined") module.exports.MyModule = factory(exports.MyModule || );
  else factory(global.MyModule = );
)(this, function(exports) 
  return exports;
);

其中一些函数也可以返回结果。在这种情况下,我希望能够在不使用require 的情况下声明参数的类型和函数的结果。 VSCode 中是否可以有一个全局的.d.ts 定义?

到目前为止,我所做的只是将函数添加到eslint 的全局变量中,以免出错。

【问题讨论】:

我不确定我是否理解正确。这是一个打字稿项目吗?如果是,将类型添加到tsconfig.json 中的paths 配置怎么样?让我知道这是否是您要查找的内容,以便稍后我会准备详细的答案。 所以你试图声明defineModule的类型而不定义函数(因为它只会被编译器内联,任何地方都没有实际的可调用函数)? @saulotoledo,我正在开发一个转译器,这意味着我正在开发一个会改变 JavaScript 文件内容的项目(完全不包括 JavaScript 或 TypeScript)。将声明放在全局 .d.ts 文件中是理想的,我可以在不需要 require 声明的情况下从我的所有项目中引用该文件。 【参考方案1】:

您可以在 settings.json 中指定您自己的 TypeScript 文件夹路径,您可以在其中使用 typescript.tsdk 选项指定您自己的 lib.*.d.ts 文件。


  "typescript.tsdk": "node_modules/typescript/lib"

【讨论】:

虽然我按照您的指示将我的.d.ts 与其他.d.ts 打字稿文件放在一起,VSCode 仍然说defineModule 的类型是any。此外,VSCode 试图使用相对于当前工作空间的路径而不是 Roaming/npm/node_modules 来获取 node_modules/typescript/lib。我已经使用绝对路径暂时解决了这个问题,但如果你也能指出我解决这个问题的正确方向,我将不胜感激。 我还有什么需要做的吗? 我认为,如果您在全局范围内安装了 typescript,则可以通过将其指向全局定义的 TypeScript 安装来规避此问题。显然,如果您的项目指向不同版本的 TypeScript,那会产生问题。 还是有点不清楚,我是应该在lib 目录下创建一个新文件(我必须声明它吗?)还是应该使用现有文件之一(哪个?) .我应该使用export 还是declare?你能举一个导出defineModule函数的例子吗? 哦,我想您已经知道如何创建您自己的 *.d.ts 文件,只需将其添加到其中即可。通过***.com/questions/21247278/about-d-ts-in-typescript,有几个例子展示了如何在其他地方声明和导出【参考方案2】:

致谢

这个答案主要是受到mootrichard's answer 的启发,但由于必须对其进行修改,才能与我的项目一起使用,所以我也添加了这个答案。

解决方案

如果您在全局 JavaScript 函数(即eval)上按 F12,则会出现一个类型声明文件(lib.es5.d.ts),其中包含 JavaScript 文档。您可以向该文件添加任何额外的命名空间或函数。但是你需要使用declare 而不是export

例子:

//... Other Global JavaScript Declarations

// JavaScript Number Interface
interface Number 
  //...


// JavaScript Date Interface
interface Date 
  //...


declare function ezDefine(moduleName: string, generator: *): void;

【讨论】:

以上是关于在 vscode JavaScript 中设置全局声明的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中设置 highchart 全局选项

在 vscode 中设置扩展的图标或徽标

当在docker容器中设置php时,如何在vscode中设置php可执行路径php.validate.executablePath?

在 VSCode 扩展中设置文本文档的语言

如何在 VSCode Ipython 中设置 cwd?

在 VSCode 调试器中设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量