TypeScript 转到由于JavaScript项目中存在tsconfig.json而中断的定义,

1rhkuytd  于 2022-10-29  发布在  TypeScript
关注(0)|答案(9)|浏览(163)

**类型脚本版本:**4.0.2
**搜索词:**转到定义javascript
代码

'use strict'

// javascript file.
const uuid = require('uuid')

预期行为:

当我在uuid上使用F12键点击Go to definition时,它会转到源代码。

这对于JavaScript来说很有效,因为tsconfig.json不存在。

实际行为:

当我用F12键点击Go to definition时,它没有做任何有用的事情。

这是因为我的JavaScript项目中存在一个tsconfig.json文件。

Playground链接:
相关问题:

icomxhvb

icomxhvb1#

我将tsconfig.json重命名为jsconfig.json,现在再次进入定义工作区...
我想这是我的错,没有使用jsconfig.json ...

gmxoilav

gmxoilav2#

我相信这是因为当我们看到tsconfig.json时,我们有一个默认值maxNodeModuleJsDepth: 0,因为我们希望您使用的所有模块都有类型声明文件(因为如果编写正确,它们会更准确,处理起来也更便宜)。我同意这是这种逻辑的一个坏结果,如果我们没有看到任何类型,我们可以根据需要解析到JS文件...我唯一担心的是,对于TypeScript用户,“找不到定义”消息可能是安装@types/uuid的一个有用提示。我认为我们希望编辑器以某种方式保留缺少信息的暗示,即使我们对现有信息尽了最大努力。@mjbvz@DanielRosenwasser,有什么想法吗?

rbl8hiat

rbl8hiat3#

我唯一担心是,对于TypeScript用户,“找不到定义”消息可能是安装@types/uuid的有用提示,
如果我正在编辑.ts typescript文件,并且使用typescript import语法,这对我来说是有意义的。
在我的示例中并不清楚,但它实际上是一个.js文件,我使用require是因为我的节点版本不支持import/export

a5g8bdjr

a5g8bdjr4#

最大节点模块Js深度
我注意到使用jsconfig.json的后果,因为我需要用cli手动设置maxNodeModuleJsDepth,比如tsc -p jsconfig.json --maxNodeModuleJsDepth 0
当运行编译器检查我的代码时,我确实希望这个最大深度为0的行为,但是当在JavaScript文件中的require语句上使用go to definition时,我希望〉0最大深度。

vshtjzan

vshtjzan5#

如果我正在编辑.ts typescript文件,并且使用typescript import语法,这对我来说是有意义的。
如果我们看到JavaScript由tsconfig文件控制,我们就非常接近于将其视为TypeScript。我有一个用JSDoc在JavaScript中维护的开源项目,我用TypeScript编译器检查了它,我知道require语句在TS中被视为与导入相同,如果我看到我的一个require语句没有神奇地得到一个转到它的定义,这让我意识到我应该尝试为它安装@types包。我们应该愿意在编辑器中从JS跳到JS,即使我们不会将JS作为类型检查的一部分使用。我只是想避免让熟悉TS的JS用户感到困惑,他们习惯于转到定义,暗示程序中存在类型信息。

ttvkxqim

ttvkxqim6#

我只是想避免让精通TS的JS用户感到困惑,他们习惯于在程序中使用定义来暗示类型信息的存在。

我们在VS代码中有“Go to type definition”。为什么精通TS的用户不能使用“Go to type definition”,而让“Go to definition”表示去函数/类/对象实现的定义,无论它碰巧在磁盘上的什么地方?

t1qtbnec

t1qtbnec8#

这是一个.ts文件特有的问题。转到定义已经像转到javascript文件的实现一样。

pw136qt2

pw136qt29#

这并不是TS文件特有的。只有当编译器分析了某个JS来获取您正在检查的符号的类型时,您才可以跳转到该JS定义。在JS项目中,您自己的源文件以及没有类型化的node_modules都是这种情况,但有类型化的node_modules则不是这种情况(无论是与JS一起提供还是通过@types提供)总之,我的观点是,我们不能通过将转到定义和转到类型定义的行为一分为二来解决这个问题的原因是,您希望前者的行为并不存在,并且由#6209跟踪。

相关问题