导入 svg 文件时打字稿找不到模块

hid*_*eto 3 svg typescript reactjs webpack webpack-file-loader

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

    TS2307: Cannot find module '~/images/slide.svg'. 
Run Code Online (Sandbox Code Playgroud)

打字稿文件放在/frontend/src/,打字稿文件构建成功。

然后,我在网站上尝试了一些解决方案。但我无法解决这个问题。我的尝试简要描述如下。

我添加了一个文件,其中在“typeRoots”中定义了类型。配置文件

{
  "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"
  ]
}
Run Code Online (Sandbox Code Playgroud)

类型/图像.d.ts

declare module '*.svg' {
  const content: any;
  export default content;
}
Run Code Online (Sandbox Code Playgroud)

我在 webpack 上使用 'file-loader' 来构建 svg fild。

请帮我!!

Kil*_*ghe 19

如果您使用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";
Run Code Online (Sandbox Code Playgroud)

tsconfig.json:

{
  ...
  "include": ["next-env.d.ts", "additional.d.ts", "**/*.ts", "**/*.tsx"],
}
Run Code Online (Sandbox Code Playgroud)


het*_*lek 12

接受的答案给我带来了奇怪的行为。例如,如果我引用未定义的变量,我的构建不会失败。

对我有用的:

  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;
}
Run Code Online (Sandbox Code Playgroud)
  1. custom.d.ts在 tsconfig.json 的 include 中添加
"include": [
  ...,
  "custom.d.ts"
]
Run Code Online (Sandbox Code Playgroud)
  1. 用法:
import { ReactComponent as MyIcon } from '../icon.svg'

...

function MyComponent() {
  return <MyIcon></MyIcon>
}
Run Code Online (Sandbox Code Playgroud)


J. *_*ier 6

我认为这是因为您在 Typescript 配置中包含了部分。尝试这个:

"include": [
  "./frontend/src/*/**"
],
Run Code Online (Sandbox Code Playgroud)

否则,您只包括输入src文件夹顶级中的文件。并且您的svg输入文件位于子级别中,因此 Typescript 不会包含它。

  • 文件规范不能以递归目录通配符 ('**') 结尾:'./src/*/**'。 (6认同)