导入 svg 文件时打字稿找不到模块
typescript cannot find module when import svg file
它是使用 Typescript、React 和 webpack 创建的 Web 应用程序。我想通过 webpack 使用 svg 文件。但是,我得到了
TS2307: Cannot find module '~/images/slide.svg'.
打字稿文件放在/frontend/src/,打字稿文件构建成功。
然后,我在网站上尝试了一些解决方案。但我无法解决这个问题。
我的尝试简单描述如下。
我在 '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 字段。
请帮帮我!!
我认为这是因为您在 Typescript 配置中的 include 部分。
试试这个:
"include": [
"./frontend/src/*/**"
],
否则,您只包括 src 文件夹顶层中的键入文件。并且您的 svg 打字文件位于子级别中,因此 Typescript 不会包含它。
我最好这样:
"include": ["**/*.ts", "**/*.tsx", "images.d.ts"],
如果您正在使用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"],
}
接受的答案对我造成了奇怪的行为。例如,如果我引用了一个未定义的变量,我的构建并没有失败。
对我有用的:
- 在项目根目录中创建
custom.d.ts
:
declare module '*.svg' {
import React = require('react');
export const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
const src: string;
export default src;
}
- 在 tsconfig.json 的包含中添加
custom.d.ts
"include": [
...,
"custom.d.ts"
]
- 用法:
import { ReactComponent as MyIcon } from '../icon.svg'
...
function MyComponent() {
return <MyIcon></MyIcon>
}
它是使用 Typescript、React 和 webpack 创建的 Web 应用程序。我想通过 webpack 使用 svg 文件。但是,我得到了
TS2307: Cannot find module '~/images/slide.svg'.
打字稿文件放在/frontend/src/,打字稿文件构建成功。
然后,我在网站上尝试了一些解决方案。但我无法解决这个问题。 我的尝试简单描述如下。
我在 '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 字段。
请帮帮我!!
我认为这是因为您在 Typescript 配置中的 include 部分。 试试这个:
"include": [
"./frontend/src/*/**"
],
否则,您只包括 src 文件夹顶层中的键入文件。并且您的 svg 打字文件位于子级别中,因此 Typescript 不会包含它。
我最好这样:
"include": ["**/*.ts", "**/*.tsx", "images.d.ts"],
如果您正在使用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"],
}
接受的答案对我造成了奇怪的行为。例如,如果我引用了一个未定义的变量,我的构建并没有失败。
对我有用的:
- 在项目根目录中创建
custom.d.ts
:
declare module '*.svg' {
import React = require('react');
export const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
const src: string;
export default src;
}
- 在 tsconfig.json 的包含中添加
custom.d.ts
"include": [
...,
"custom.d.ts"
]
- 用法:
import { ReactComponent as MyIcon } from '../icon.svg'
...
function MyComponent() {
return <MyIcon></MyIcon>
}