无法导入打字稿中的svg文件


115

typescript(*.tsx)文件中,我无法使用以下语句导入svg文件:

import logo from './logo.svg';

Transpiler说:[ts] cannot find module './logo.svg'. 我的svg文件仅为<svg>...</svg>

但是在.js文件中,我可以完全相同的导入语句导入它而不会出现任何问题。我想这与svg文件的类型有关,必须为ts transpiler设置某种方式。

您能否在ts文件中分享如何进行这项工作?


2
svg文件不是javascript,不能用作javascript模块。您应该改为使用http请求加载这些文件。
toskv

2
您在使用Webpack吗?这是我所看到的唯一了解这种import说法的东西。也许Webpack允许您在JavaScript中使用此功能,但是在TypeScript文件中却没有达到同样的效果。(我不认为TypeScript本身知道在这里做什么。)
user94559

1
如果您使用的是Webpack,则可能需要共享Webpack配置以获得更多帮助。
user94559

2
阅读更多有关此内容的信息,您可能会做const logo = require("./logo.svg");或只是忽略该错误。(我相信TS应该仍会输出正确的代码。)
user94559 '23

非常感谢你!要求作品好!就我而言,必须是 const logo = require("./logo.svg") as string;
AngryBoy

Answers:


191

如果使用webpack,则可以通过创建自定义类型文件来实现。

创建一个名为custom.d.ts的文件,其内容如下:

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

添加custom.d.tstsconfig.json如下

"include": ["src/components", "src/custom.d.ts"]

来源:https//webpack.js.org/guides/typescript/#importing-other-assets


36
可能需要将其添加到tsconfig.json中include部分。
Frederik Krautwald '17

12
谢谢!我知道它必须包含在某个位置,但是我无法在哪里成像。甚至我以为它在tsconfig.json中,但我不知道该怎么做。感谢您的评论。我进行了搜索,发现:"files": [ "custom.d.ts" ]
Shil Nevado

5
您可以通过键入以下内容来进行JSX组件的类型检查:const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
RedMatt

是否可以使custom.d.ts文件在全局范围内工作,以便SVG可以位于与custom.d.ts文件不同的目录中?我收到一个错误“找不到模块”,除非它在同一目录中。
Nic Sc​​ozzaro

1
这不会在Angular中导入文件的内容,而是将文件名作为字符串导入。我需要内容。我们如何获取文件的内容?
Routhinator

37

感谢smarx指出use require()。所以在我的情况下应该是:

const logo = require("./logo.svg") as string;

在* .tsx文件中可以正常工作


5
logo可能会更好地命名logoPath,因为这就是它的名称。
DharmaTurtle

2
@DharmaTurtle我认为可以争论。而且,它logo在问题中被称为,因此它是对这个特定问题的更好答案。
ArneHugo

老实说,@ DharmaTurtle,变量的名称很重要,为什么要为这样琐碎的事情而分心?
ELI7VH

17

添加一个custom.d.ts具有正确类型(感谢RedMatt)的文件(我在src目录的根路径上创建了它):

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 />); 
}

4

我找到的解决方案:在ReactJS项目中,在文件react-app-env.d.ts中,您只需要删除注释中的空格,例如:

之前

// / <reference types="react-scripts" />

/// <reference types="react-scripts" />

希望对你有帮助


对于正在使用create-react-app和已配置eslint的用户,这可能可以解决问题
Daniel Chin

2

我在尝试REACT +打字稿教程时遇到了同样的问题。
对我有用的是以下导入声明。

import * as logo from 'logo.svg'

这是我在package.json中的依赖项。

  "dependencies": {
    "react": "^16.8.4",
    "react-dom": "^16.8.4",
    "react-scripts-ts": "3.1.0"
  },

希望它可以帮助某人。


0

我们已经实现了另一种方法:制作SVG组件。我这样做是因为它使我感到困惑,因为我在requireimports 一起使用commonJS 语句。


0
    // eslint-disable-next-line spaced-comment
/// <reference types="react-scripts" />

如果您使用的是puglin slint,则可能是因为他已禁用,以为这是评论,但不阅读svg,则需要此类型脚本模块,只需禁用该行即可


0

要将n 个代码资源与TypeScript一起使用,我们需要推迟这些导入的类型。这需要一个custom.d.ts文件,该文件表示我们项目中TypeScript的自定义定义。

让我们为.svg文件设置一个声明:

定制文件

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

在这里,我们通过指定任何以.svg结尾的导入并将该模块的内容定义为SVG来声明一个新的SVG模块。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.