VSCode 仅在 Foo.js 在某处导入时通过相应的 Foo.d.ts 为 Foo.js 提供智能感知;如何在 Foo.js 本身中启用智能感知?

Posted

技术标签:

【中文标题】VSCode 仅在 Foo.js 在某处导入时通过相应的 Foo.d.ts 为 Foo.js 提供智能感知;如何在 Foo.js 本身中启用智能感知?【英文标题】:VSCode provides intellisense for Foo.js via a corresponding Foo.d.ts only when it’s imported somewhere; how to enable intellisense in a Foo.js itself? 【发布时间】:2020-11-23 21:18:19 【问题描述】:

设置是一个“创建 React 应用程序”,带有以下 jsconfig.json


  "compilerOptions": 
    "experimentalDecorators": true,
    "baseUrl": "src"
  ,
  "include": ["src"]

目录结构:

.
└── src
    └── Components
        └── Foo
            ├── Bar
            │   ├── Bar.js
            │   ├── Bar.d.ts
            │   └── index.js
            ├── Foo.js
            └── index.js

// React component `Foo` imports a component `Bar`:

import  Bar  from './Bar'

export function Foo(props) 
  //


// And gets full intellisense via `Bar.d.ts`:

type Props = 
  /** ... */


export declare function Bar(
  props: Props
): React.FunctionComponent

但是Bar.js 本身并没有从它自己的Bar.d.ts 文件中获得智能感知,有没有办法解决它?我尝试了三斜杠指令 (/// <reference path="Bar.d.ts"/>),但没有帮助。一些 JSDoc 有所帮助,但是有一个专门的声明文件并仍然使用 JSDoc 是没有意义的;它也可能只适用于 VSCode,这是不可取的:

export function Bar(
  // When `type Props` is exported from the `.d.ts`:
  /** @type import("./Bar").Props */ props
) 

【问题讨论】:

VSCode 还允许你使用 JSDoc 来获取类型提示——我在纯 JS 项目中大量使用它,但我会说明你是否愿意使用 TS 定义文件,为什么不直接使用一路TS? @Jhecht 我确实是从 JSDoc 开始的——不记得我有什么智能感知问题(很久以前),但这就是为什么我开始使用声明文件来描述形状,在end 对我来说比 JSDoc 更好。我不想用细节来打扰你,但要为这个项目完全使用 TypeScript 是非常困难的,因为它会增加另一层我还没有准备好处理的复杂性。 【参考方案1】:

自 2020 年 9 月起,这是打算 (source):

[...] “.d.ts 是 .js 的边车”没有受支持的场景。这里推荐的做法是使用 JS Doc 来编写你的类型注解。

关注 TypeScript 的发展,看看未来会不会发生变化。

【讨论】:

【参考方案2】:

您可以像在 typescript 中一样使用 JSDoc 来定义类、函数和所有内容。

我做过的最好的用法之一是在文件connect.js file on Github 中。 我不想提交包含数据库凭据的文件。于是,我在 JSDoc 中定义了一个类、枚举等。

【讨论】:

以上是关于VSCode 仅在 Foo.js 在某处导入时通过相应的 Foo.d.ts 为 Foo.js 提供智能感知;如何在 Foo.js 本身中启用智能感知?的主要内容,如果未能解决你的问题,请参考以下文章

前端笔记 - 模块(module)

ImportError:在 vscode 中使用导入 syft 导入 lib 时 DLL 加载失败

导入 PySide2 时 DLL 加载失败,仅在调试时

仅在添加到刀片页面时导入 Vue 组件

从系统某处调用脚本时如何导入配置文件?

使用 ajax 刷新页面时,Ruby on Rails 失败