如何为npm的config包配置智能提示所需的配置结构?
config模块配置项智能提示自动化实现方案
分两种场景实现,无需手动维护常量映射:
1 TypeScript项目方案(推荐,类型安全+全量提示)
利用TS的类型推导能力,直接从JSON配置文件生成类型,给config的get方法做类型重载,实现输入时自动提示所有合法配置路径、返回值自动匹配类型。
操作步骤
- 第一步:修改
tsconfig.json,打开JSON模块解析开关:
{ "compilerOptions": { "resolveJsonModule": true, "esModuleInterop": true, // 其他原有配置保持不变 } }
- 第二步:新增类型声明文件
src/types/config.d.ts:
import type { default as DefaultConfig } from '../config/default.json'; // 如果有多环境配置,额外导入其他配置文件的类型,合并即可: // import type { default as DevConfig } from '../config/development.json'; // type FullConfig = DefaultConfig & DevConfig; // 工具类型:递归生成对象所有嵌套路径的点分隔字符串字面量 type DeepKey<T, Prefix extends string = ''> = T extends object ? { [K in keyof T]: K extends string ? Prefix extends '' ? DeepKey<T[K], K> : DeepKey<T[K], `${Prefix}.${K}`> : never }[keyof T] : Prefix; type AllConfigKeys = DeepKey<DefaultConfig>; // 重载config.get方法的类型 declare module 'config' { interface IConfig { get<T extends AllConfigKeys>(key: T): T extends `${infer A}.${infer B}` ? B extends `${infer C}.${infer D}` ? DefaultConfig[A][C][D] : DefaultConfig[A][B] : DefaultConfig[T]; } }
配置完成后,调用config.get()时输入第一个字符就会自动弹出所有可用配置路径的提示,返回值也会自动匹配对应类型。
2 JavaScript项目方案
通过JSDoc+jsconfig配置实现智能提示:
- 第一步:修改
jsconfig.json,开启类型检查:
{ "compilerOptions": { "checkJs": true, "resolveJsonModule": true } }
- 第二步:在导入
config的位置添加JSDoc类型声明:
/** * @typedef {import('./config/default.json')} DefaultConfig * @template T * @typedef {T extends object ? { [K in keyof T]: K extends string ? `${K}${'' extends DeepKey<T[K]> ? '' : '.'}${DeepKey<T[K]>}` : never }[keyof T] : ''} DeepKey * @typedef {DeepKey<DefaultConfig>} AllConfigKeys * @type {{ get: <T extends AllConfigKeys>(key: T) => any } & import('config').IConfig} */ import config from 'config';
配置后即可获得输入提示能力。
3 通用懒方案:自动生成常量映射文件
如果不想改类型配置,可以写一个脚本自动从JSON配置生成你需要的常量映射文件,每次修改配置后执行一次脚本即可,无需手动维护:
// generate-config-constants.js const fs = require('fs'); const defaultConfig = require('./config/default.json'); function generateConstants(obj, prefix = '') { const result = {}; for (const key in obj) { const fullKey = prefix ? `${prefix}.${key}` : key; if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) { result[key.toUpperCase()] = generateConstants(obj[key], fullKey); } else { result[key.toUpperCase()] = fullKey; } } return result; } const constants = generateConstants(defaultConfig); const outputContent = `export const CONFIG = ${JSON.stringify(constants, null, 2)};\n`; fs.writeFileSync('./src/constants/config.js', outputContent);
把脚本添加到package.json的执行命令中:
{ "scripts": { "gen:config": "node generate-config-constants.js" } }
后续修改配置文件后执行npm run gen:config即可自动更新常量文件。
内容的提问来源于stack exchange,提问作者zmii
相关产品推荐
相关产品推荐

