TypeScript Cookbook

1. 使用含有通配符的模块声明文件 d.ts

项目 docs/examples/erp-configs 文件夹下存在多个自动生成同一个结构的 erp_x.js 配置文件。当在 TypeScript 项目中直接引入 js 文件使用会提示缺少类型声明文件。

import config from 'docs/examples/erp-configs/erp_1';
// error 找不到模块“docs/examples/erp-configs/erp_1”或其相应的类型声明。

解决方案:为 erp-configs 文件夹下所有 js 文件新建类型声明文件 d.ts

  • 项目结构。

    项目
    |-- docs
    	|-- examples
    		|-- erp-configs
    			|-- erp_1.js
    			|-- erp_2.js
    			|-- ...
    
  • 配置文件。

    // erp_1.js 文件的伪代码
    export default {
        ERP_BizObj: { ID: 10010, Name: '对象1'},
        ERP_BizMTButton: { ID: 10086, Name: '按钮1'},
    }
    
  • 首先使用 viteresolve.alias 文件系统路径别名功能统一配置的入口。

    // vite.config.ts
    import { resolve } from 'node:path'
    import { defineConfig } from 'vite'
    
    export default defineConfig({
      resolve: {
        alias: {
          'examples-configs': resolve(__dirname, './docs/examples/erp-   configs')
        }
      }
    })
    
  • 然后在新建 erp-configs.d.ts 类型声明文件,declare module 描述的模块名可以使用通配符。

    下面示例中,模块名 examples-configs/* 表示适配所有以 examples-configs/ 开头的模块名(比如 examples-configs/erp_1)。

    // docs/erp-configs.d.ts
    declare module 'examples-configs/*' {
        interface ERPBizObjConfig {
            ERP_BizObj: Record<string, any>;
            ERP_BizMTButton: Array<Record<string, any>>;
        }
        
        const config: ERPBizObjConfig;
        export default config;
    }
    
  • 配置 tsconfig.json 文件。

    {
      "compilerOptions": {
        "include" : ["docs/**/*.d.ts"]
      }
    }
    
    
  • 通过 examples-configs 模块名引入配置文件就可以匹配到类型声明了。

    import config from 'examples-configs/erp_1'
    

有关详细信息,请参阅: