typescriptでsvgファイルをインポートできません


108

typescript(*.tsx)ファイル私はこの文でSVGファイルをインポートすることはできません。

import logo from './logo.svg';

Transpilerさんのコメント:[ts] cannot find module './logo.svg'. 私のsvgファイルはただ<svg>...</svg>です。

しかし、.jsファイルでは、まったく同じインポートステートメントで問題なくインポートできます。ts transpilerに何らかの方法で設定する必要があるsvgファイルのタイプと関係があると思います。

これをtsファイルで機能させる方法を教えてください。


2
svgファイルはJavaScriptではないため、JavaScriptモジュールのように使用できません。代わりにhttpリクエストを使用してこれらのファイルをロードする必要があります。
toskv 2017年

1
Webpackを使用していますか?それが私が見た唯一のことはそのようなimport声明を理解しました。おそらく、WebpackがJavaScriptでこれを可能にしているのかもしれませんが、TypeScriptファイルでは同じ魔法をかけていません。(TypeScript自体がここで何をすべきかを知っているとは思わない。)
user94559

1
Webpackを使用している場合は、Webpack構成を共有してさらにヘルプを取得する必要があります。
user94559 2017年

2
これについてもう少し読むと、おそらくconst logo = require("./logo.svg");エラーを実行するか、単に無視できます。(TSはまだ正しいコードを出力しているはずです。)
user94559

どうもありがとうございました!良い作品が必要です!私の場合、それは const logo = require("./logo.svg") as string;
AngryBoy 2017年

回答:


184

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.jsonincludeセクションに追加する必要があります。
フレデリククラウトヴァルト2017年

12
ありがとう!どこかに含まれている必要があることは知っていましたが、どこにあるのかイメージできません。tsconfig.jsonにあると思っていても、方法がわかりませんでした。コメントありがとうございます。私は、検索を行なったし、私が見つかりました:"files": [ "custom.d.ts" ]
Shilネバド

5
あなたは、コンテンツを入力してJSXコンポーネントの型チェックを取得することができます:const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
RedMatt

custom.d.tsSVGがcustom.d.tsファイルとは別のディレクトリにあるように、ファイルをグローバルに機能させることは可能ですか?同じディレクトリにない限り、「モジュールが見つかりません」というエラーが表示されます。
Nic Sc​​ozzaro、

1
これはファイルのコンテンツをAngularにインポートせず、ファイル名を文字列としてインポートします。内容が必要です。ファイルのコンテンツを取得するにはどうすればよいですか?
ルーティネーター

37

使用を指摘してくれたsmarxに感謝しますrequire()。したがって、私の場合は次のようになります。

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

* .tsxファイルで正常に動作します


5
logoという名前logoPathになるので、より適切な名前が付けられます。
DharmaTurtle

2
@DharmaTurtle私はそれが議論されることができると思います。また、それが呼ばれていますlogoそれがあるとして、それは、この特定の質問に良い答えですので、質問に。
ArneHugo

17

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

4

私が見つけた解決策:ReactJSプロジェクトのファイルreact-app-env.d.tsで、コメントのスペースを削除するだけです。

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

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

あなたを助けたいです


作成反応するアプリや設定さeslintを使用している人にとって、これは問題解決することがあり
ダニエル・チン

2

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"
  },

それが誰かを助けることを願っています。


1

TypeScriptでn オンコードアセットを使用するには、これらのインポートのタイプを遅延させる必要があります。これには、プロジェクト内のTypeScriptのカスタム定義を示すcustom.d.tsファイルが必要です。

.svgファイルの宣言を設定しましょう:

custom.d.ts

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

ここでは、.svgで終わるインポートを指定し、モジュールのコンテンツをanyとして定義することにより、SVGの新しいモジュールを宣言しています。


0

これを実行する別の方法があります。SVGコンポーネントを作成します。これを行ったのはrequireimports と一緒にcommonJS ステートメントを使用していたことがバグだったからです。


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

puglin slintを使用している場合、コメントであると考えて彼が無効にした可能性がありますが、svgを読み取らない場合は、このタイプのスクリプトモジュールが必要なので、行を無効にして満足してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.