在 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 中设置全局声明的主要内容,如果未能解决你的问题,请参考以下文章
当在docker容器中设置php时,如何在vscode中设置php可执行路径php.validate.executablePath?