VS Code能否自动识别代码库中的typedef与enum?
针对你遇到的VS Code无法自动识别代码库中typedef和@enum类型,必须手动写冗长import类型注解的问题,这里有几个简便的解决方案,结合你的目录结构和jsconfig.json配置来调整:
1. 优化jsconfig.json配置,让VS Code自动扫描类型文件
你的现有jsconfig.json已经设置了baseUrl,可以添加include字段指定要扫描的类型文件目录,或者用typeRoots告诉VS Code去哪里找全局类型:
{ "compilerOptions": { "target": "es6", "baseUrl": ".", "checkJs": true, "typeRoots": ["./constants", "./constants/typedefs"] // 指定类型文件根目录 }, "include": [ "constants/**/*.js", "constants/typedefs/**/*.js", "src/**/*.js" // 记得加上你的业务代码目录 ] }
这样VS Code的语言服务会自动扫描这些目录下的JSDoc注解,不需要每个地方都手动导入类型。
2. 正确使用JSDoc的全局类型声明
你已经用了@global,但单独的@global在ES模块(用了export)里可能不生效,因为模块作用域会覆盖全局。可以创建一个全局声明文件(比如global.d.js),在里面导入你的类型并重新声明为全局:
比如在项目根目录创建global.d.js:
// 导入你的enum和typedef import { MY_ENUM } from './constants/enums.js'; import { SomeDef } from './constants/typedefs/some_def.js'; /** * @global * @typedef {SomeDef} SomeDef */ /** * @global * @type {typeof MY_ENUM} */ const MY_ENUM = MY_ENUM;
这样在其他业务文件里,就可以直接用@param {MY_ENUM}或者@type {SomeDef},不需要手动导入。
3. 使用路径别名简化类型引用
如果不想用全局类型,也可以利用jsconfig.json的paths配置别名,缩短导入路径:
{ "compilerOptions": { "target": "es6", "baseUrl": ".", "checkJs": true, "paths": { "@constants/*": ["./constants/*"], "@typedefs/*": ["./constants/typedefs/*"] } } }
之后类型注解就可以写成:
/** * @param {import('@constants/enums.js').MY_ENUM} enumVal */ function test(enumVal) { ... }
比原来的绝对路径简洁很多。
补充说明
VS Code的JS IntelliSense是基于TypeScript语言服务的,所以确保你的VS Code是最新版本,并且启用了javascript.implicitProjectConfig.checkJs(你已经在jsconfig.json里设置了checkJs: true,这个已经满足)。另外,对于深层嵌套的typedef文件,只要在include或typeRoots里包含了对应的目录,VS Code就能自动识别到。
内容的提问来源于stack exchange,提问作者dougalg

