在typescript(*.tsx)文件中,我不能用下面的语句导入svg文件:
import logo from './logo.svg';
Transpiler说:[ts]找不到模块'./logo.svg'。 我的svg文件就是<svg>…</svg>。
但在.js文件中,我能够导入它没有任何问题,完全相同的导入语句。我想这与svg文件的类型有关,它必须以某种方式为ts transpiler设置。
你能在ts文件中分享一下如何做到这一点吗?
在typescript(*.tsx)文件中,我不能用下面的语句导入svg文件:
import logo from './logo.svg';
Transpiler说:[ts]找不到模块'./logo.svg'。 我的svg文件就是<svg>…</svg>。
但在.js文件中,我能够导入它没有任何问题,完全相同的导入语句。我想这与svg文件的类型有关,它必须以某种方式为ts transpiler设置。
你能在ts文件中分享一下如何做到这一点吗?
当前回答
没有webpack和custom.d.ts的解决方案
对我来说,上面的解决方案单独一个都不起作用。因为我在目前的项目中没有使用Webpack。
我研究了日志中的输出,然后使用以下方式,无需创建文件(custom.d.ts),更改配置或安装新的依赖项:
const logo: string = require("../assets/images/logo.svg").default;
<img src={logo} alt="logo" />
对于svg格式,您需要添加.default,但对于png格式则不需要。
其他回答
如果你使用的是create-react-app 2+: docs
添加一个custom.d.ts文件(我在src目录的根路径上创建的),使用正确的类型(感谢RedMatt):
declare module '*.svg' {
const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
export default content;
}
安装svg-react-loader或其他,然后:
使用它作为主要的svg加载器 或者如果你正在迁移一个代码库,并且不想接触工作部分(JS),请在导入时指定加载器:
import MySVG from '-!svg-react-loader!src/assets/images/name.svg'
然后将其用作JSX标记:
function f() {
return (<MySVG />);
}
我在尝试REACT + typescript教程时也遇到了同样的问题。 对我有用的是下面的重要陈述。
import * as logo from 'logo.svg'
下面是我在package.json中的依赖项。
"dependencies": {
"react": "^16.8.4",
"react-dom": "^16.8.4",
"react-scripts-ts": "3.1.0"
},
希望它能帮助到别人。
希望!这会帮助到别人。
实际上,我尝试了所有的步骤,但有一件事我们必须理解,您必须将custom.d.ts文件创建到相应的SVG导入文件夹中。
Ts配置文件
{
"compilerOptions": {
"target": "ES6",
"jsx": "react",
"module": "ESNext",
"moduleResolution": "Node",
"baseUrl": "./",
"paths": {
"@components/*": ["src/components/*"],
"@styles/*": ["src/styles/*"],
"@static/*": ["src/static/*"]
},
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"isolatedModules": true
},
"include": ["src/**/*", "src/static/optional.d.ts"],
"exclude": ["node_modules", "build"]
}
optional.d.ts
declare module '*.svg' {
import * as React from 'react';
export const ReactComponent: React.FunctionComponent<React.SVGProps<
SVGSVGElement
> & { title?: string }>;
const src: string;
export default src;
}
最后是常用的导出文件:
import Logo from './images/logo.svg';
import BellDot from './images/bell-dot.svg';
import Logout from './images/logout.svg';
import pageNotFound from './images/page-not-found.png';
export {
Logo,
BellDot,
pageNotFound,
Logout
}
更好的主意是:
找不到模块或对应的类型声明|无法在typescript中导入svg文件
在。/custom.d中。Ts文件,添加这个:
declare module '*.svg' {
const content: string;
export default content;
}
如果你有任何困惑,请观看这个视频。 https://www.youtube.com/watch?v=Skhgdp7R9Tk
对我来说,当我在src/types/images.d.ts中放入以下一行时,它就工作了
声明模块'*.svg';
我用下面的方法导入图像
import {ReactComponent as WifiIcon} from '../../ assets/images/Wifi.svg';
在tsconfig.json
我有以下complierOptions
"compilerOptions": {
"typeRoots": ["node_modules/@types", "src/types"]
}
希望它能帮助到别人。我使用的是最新版本的CRA。