【问题标题】:Set global declaration in vscode JavaScript在 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 声明的情况下从我的所有项目中引用该文件。

标签: javascript visual-studio-code typescript-typings


【解决方案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 文件,只需将其添加到其中即可。通过stackoverflow.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;

【讨论】:

    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 2011-05-09
    • 2020-07-21
    • 2011-03-22
    • 2011-03-28
    • 2020-12-10
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多