6

作为一个有趣的项目,我正在制作一个用于创建本地 Web 组件的“框架”。我创建了一个 webpack 加载器,它解析自定义.comp文件中的一些 XML 并导出一个 es2015 类。不幸的是,我找不到.comp在我的打字稿文件中导入这些文件的方法。

我尝试将自定义文件导入常规 javascript 文件,一切正常;我可以看到我创建的加载器正在运行,并且得到了预期的输出。但是当我尝试导入打字稿文件时,我得到了错误Cannot find module 'test/test.comp'。我尝试创建一个空的声明文件并注意到错误消息更改为File '[path]/test/test.d.ts' is not a module

这是我的 webpack 配置:

mode: 'development',
watch: true,
entry: './test/main.js',
output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'build')
},
module: {
    rules: [
        {
            test: /\.ts/,
            use: 'ts-loader',
            exclude: /node_modules/
        },
        {
            test: /\.comp/,
            use: path.resolve(__dirname, 'core/compose-loader.js'),
            exclude: /node_modules/
        }
    ]
},
resolve: {
    extensions: ['.js', '.ts', '.comp'],
    alias: {
        'core': path.resolve(__dirname, "core/"),
        'test': path.resolve(__dirname, "test/")
    }
}

还有我的 tsconfig.json

{
    "compilerOptions": {
        "outDir": "build",
        "baseUrl": ".",
        "paths": {
            "core": ["core/*"],
            "test": ["test/*"]
        },
        "target": "es2015",
        "typeRoots": ["./core"]

    },
    "include": [
        "test/*.ts"
    ],
    "exclude": [
        "core",
        "node_modules",
        "**/*.comp"
    ]
}
4

1 回答 1

17

*.comp您可以在一个declarations.d.ts文件(或您选择的任何名称)中定义所有这些文件的类型。

declare module "*.comp" {
  const value: any; // Add better type definitions here if desired.
  export default value;
}

您可能还需要将此添加到typeRoots您的tsconfig.json

{
    "compilerOptions": {
        // Other configuration...
        "typeRoots": [
            "./src/declarations.d.ts"
        ]
    }
}

现在,import value from "./test.comp"应该按预期工作(至少是类型)。

注意:对于 VSCode,定义文件在文件夹结构中不应高于导入文件。

于 2019-09-28T20:19:33.363 回答