【问题标题】:Importing images in TypeScript React - "Cannot find module"在 TypeScript React 中导入图像 - “找不到模块”
【发布时间】:2019-03-16 11:40:30
【问题描述】:

我正在尝试导入图像以在带有 TypeScript 的 React 组件中使用。我使用的打包工具是 Parcel(不是 Webpack)。

我在项目中创建了一个带有图像文件扩展名的.d.ts 文件,并将其包含在tsconfig.json 中。但是,当我尝试导入图像时,T​​S 对我大喊Cannot find module

我的项目结构:

+ src
  + assets
    - image.jpg
  + components
    - Box.tsx
    - App.tsx
  - index.d.ts
  - index.html
  - index.tsx
- tsconfig.json
- tslint.json

我尝试像这样在App.tsx 中导入图像。 VS Code 下划线'../assets/image.jpg' 表示Cannot find module '../assets/image.jpg'

import * as React from 'react';
import * as img from '../assets/image.jpg';

const Box = props => {
  // do things...
}

export default Box;

我在网上找到的讨论表明需要自己定义一个.d.ts 文件,所以我用这一行创建了那个index.d.ts 文件。

declare module '*.jpg';

然后在tsconfig.json 中添加"include": ["./src/index.d.ts"],在"compilerOptions" : {...} 之后。

我错过了什么?如何修复 TS 抛出的错误?

【问题讨论】:

标签: reactjs typescript visual-studio-code bundler parceljs


【解决方案1】:

在文件夹src中创建index.d.ts文件,并添加这一行

declare module '*.jpg';

【讨论】:

  • 有效,但请您告诉我为什么以及如何有效?这是否与打字稿有关,还是vscode?是否就像忽略掉毛问题一样的错误?请说清楚。谢谢。
  • @Rishav 我认为这是特定于简写声明的typescriptlang.org/docs/handbook/modules.html All imports from a shorthand module will have the any type.
  • 奇怪的是,如果我在 vs 代码中关闭 index.d.ts 文件。然后错误返回。只有当文件打开时它才能工作。有谁知道为什么?
【解决方案2】:

如果你在tsconfig.json 中写了"include": ["./src/index.d.ts"] 而你没有"files" 设置,这意味着tsconfig.json 定义的项目只包含单个文件./src/index.d.ts。当您在 VS Code 中打开任何其他文件时,VS Code 会使用不使用您的 tsconfig.json 的单独语言服务实例。调整您的"include" 设置以匹配项目中的所有.ts.tsx 文件,或者只是删除它并依赖默认行为,即在包含tsconfig.json 的目录下包含所有文件。

第二轮

TypeScript 忽略了index.d.ts,因为它假定index.d.ts 是从index.tsx 生成的,而index.tsx 更有可能是最新的。将您的 index.d.ts 文件命名为其他名称,例如 declaration.d.ts

【讨论】:

  • 我确实写了"include": ["./src/index.d.ts"]?。现在我删除了该行并重新启动了 VS Code,但问题仍然存在(Cannot find module '../assets/image.jpg')。问题可能是由捆绑程序引起的吗?但如果 VS Code 使用单独的语言服务,我认为使用哪个捆绑器并不重要。
  • 没关系,我想我找到了问题所在。查看更新的答案。
  • 哇,这太神奇了,非常感谢!!我几乎整个上午都在试图弄清楚为什么它不起作用:)))
  • 您的第 2 轮是不断给予的礼物。您刚刚解决了我的 index.d.ts 和 SVG 问题,谢谢!
【解决方案3】:

创建模块/类型

# src/types/images.d.ts
declare module '*.jpg';
declare module '*.jpeg';

更改 tsconfig.json

{
    "compilerOptions": {
        "typeRoots" : ["node_modules/@types", "src/types"]
    }
}

【讨论】:

  • 嗨我想挖掘一下,因为我已经创建了 types/images.d.ts 并且这个 typeRoots 选项没有帮助,但是这个相同的声明 - 现在 include 中的“src/types”工作了我的包含看起来像“include”:[“src/*”,“src/types”],它有点像复制路径,因为 src/* 也应该涵盖第二个用例,但它没有。为什么包含有效而 typeRoots 没有,因为“'typeRoots' 指定了转译器应在其中查找类型定义的根文件夹”
【解决方案4】:

有一个解决方法 例如,

import logo from "../../assets/logo.png"

改成

const logo =  require("../../assets/logo.png")

【讨论】:

  • 会给你一个类似require statement not part of an import statement的错误
  • 安装requireJS(或者是commonJS)
  • 如果您使用 react
【解决方案5】:

我已经粘贴了:

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

来自我的一个较旧的项目:react-app-env.d.ts 并且它有效。

在最新版本的CRA 中(当TS 是所选语言时),此文件会自动添加到src 文件夹并包含上面显示的单行。它是从react-scripts 引用类型的指令。

【讨论】:

  • 两行都是cmets?
  • 他们不仅仅是 cmets。就 JavaScript 而言,是的,它们是 cmets。但是,第一行是 eslint 的指令,以忽略下一行的 linting 规则。 Eslint 在 linting 代码之前会寻找这些类型的 cmets。第二行是在打字稿文件中引用类型的一种方式。见->typescriptlang.org/docs/handbook/triple-slash-directives.html
  • 抑制错误并不能解决根本问题,这是一种糟糕的做法!
  • @MichaelEakins 第二行实际上确实清除了错误,而不是像您建议的那样抑制它。对于这个问题中描述的问题,第一行几乎没有用。
猜你喜欢
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2019-06-04
相关资源
最近更新 更多