reactjs 输入svg文件时,typescript找不到模块

wtzytmuj  于 2023-06-22  发布在  React
关注(0)|答案(4)|浏览(163)

这是一个使用Typescript,React和webpack创建的Web应用程序。我想通过webpack使用svg文件。然而,我得到了

TS2307: Cannot find module '~/images/slide.svg'.

将Typescript文件放在/frontend/src/上,并成功构建typescript文件。
然后,我在网站上尝试了一些解决方案。但我解决不了这个问题。我所尝试的内容简要描述如下。
我添加了一个文件,其中定义的类型在'typeRoots'。tsconfig.json

{
  "compilerOptions": {
    "outDir": "./app/assets/javascripts/bundles",
    "sourceMap": true,
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "noImplicitAny": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "moduleResolution": "node",
    "module": "es2015",
    "target": "es6",
    "jsx": "react",
    "removeComments": true,
    "baseUrl": ".",
    "paths": {
      "~/*": ["./frontend/src/*"]
    },
    "typeRoots": ["types", "node_modules/@types"]
  },
  "awesomeTypescriptLoaderOptions": {
    "useCache": true,
    "cacheDirectory": "tmp/build_caches/awesome-typescript-loader"
  },
  "include": [
    "./frontend/src/*"
  ],
  "exclude": [
    "node_modules",
    "bundles",
    "**/*.js"
  ]
}

types/images.d.ts

declare module '*.svg' {
  const content: any;
  export default content;
}

我在webpack上使用'file-loader'来构建svg文件。
请救救我!!

aydmsdu9

aydmsdu91#

如果你使用的是Nextjs,你可以创建一个新的文件additional.d.ts(与next-env.d.ts相同的级别),并为图像文件声明模块。然后,您应该将此文件包含在tsconfig.json中。
additional.d.ts

declare module "*.png";
declare module "*.jpg";
declare module "*.jpeg";
declare module "*.svg";
declare module "*.gif";

tsconfig.json

{
  ...
  "include": ["next-env.d.ts", "additional.d.ts", "**/*.ts", "**/*.tsx"],
}
kulphzqa

kulphzqa2#

我想这是因为你在Typescript配置中的 include 部分。试试这个:

"include": [
  "./frontend/src/**/*"
],

否则,您只包括在 src 文件夹顶层的键入文件。而且你的 svg 类型文件在一个子级别中,所以Typescript不会包含它。

z8dt9xmd

z8dt9xmd3#

这个被接受的答案引起了我奇怪的行为。例如,如果我引用了一个未定义的变量,我的构建就不会失败。
什么对我起作用:
1.在项目根目录下创建custom.d.ts

declare module '*.svg' {
  import React = require('react');
  export const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
  const src: string;
  export default src;
}

1.在tsconfig.json的include中添加custom.d.ts

"include": [
  ...,
  "custom.d.ts"
]

1.用途:

import { ReactComponent as MyIcon } from '../icon.svg'

...

function MyComponent() {
  return <MyIcon></MyIcon>
}
mwngjboj

mwngjboj4#

我最好是这样的:

"include": ["**/*.ts", "**/*.tsx", "images.d.ts"],

相关问题