web-dev-qa-db-ja.com

タイプスクリプトからnpmモジュールを消費する方法は?

TypeScriptのショットを提供しています。 Hello Worldの段階では正常に機能します。私は現在npmモジュールを使用しようとしています:

index.ts =

import _ = require('lodash')

console.log(_.toUpper('Hello, world !'))

これは機能しません:

  • tsc index.ts-> Cannot find module 'lodash'. (2307)
  • node-ts index.js-> Cannot find module 'lodash'. (2307)

TypeScriptのドキュメントとGoogleを見ても助けにはなりませんでした。他のS/Oの質問は、未回答( here および here )または無関係です。

要素:

  • TypeScript 1.8最新
  • はい、lodashはnpm i --save lodashにインストールされ、ファイルシステムに存在します(チェック済み)
  • 私もtypings i --save lodashをしました
  • バリアントimport * as _ from 'lodash'またはconst _ = require('lodash')も機能しません
  • Tsconfig.jsonオプションを他の回答"moduleResolution": "node"および"module": "commonjs"で提案されているように調整してみました

TypeScriptでnpmパッケージをどのように消費しますか?

68
Offirmo

[2018/12] 2016年に尋ねたこの質問に対する新しい、最新の回答。古い回答があったにもかかわらず、多くの活動を示しています。

簡単に言えば、TypeScriptはtype informationsがパッケージのコードについて(別名 " type declare files " aka "typings")必要であり、そうでなければ全体を失うことになるのは当然ですTypeScriptのポイント。それらを提供またはオプトアウトするには、いくつかの解決策があります。ここに、ベストプラクティスの順に示します。


Solution:モジュールは既にタイピングを提供しています。 package.jsonにそのような行が含まれている場合:

"typings": "dist/index.d.ts",

typeScriptは既に有効になっています。このスタックオーバーフローページを読んでいる場合は、ほとんどの場合そうではないので、続けましょう...


Solution 1DefinitelyTyped のコミュニティが提供するタイピングを使用します。モジュール "foo"の場合、これを試してください:

npm add -D @types/foo

うまくいけば、大当たり!これでタイピングが完了し、モジュールを使用できます。 npmが@ types/fooモジュールを見つけられないと不平を言ったら、続けましょう...


Solution 2:このモジュールに関するカスタムタイプを提供します。 (ゼロエフォートを行うオプション付き)

  1. プロジェクトのルートに「typings-custom」という名前のフォルダーを作成します
  2. Tsconfig.jsonでこのフォルダーのコンテンツを参照します。
"include": [
    "./typings-custom/**/*.ts"
]
  1. 次の正確な名前のファイルを作成します:foo.d.ts [foo =モジュールの名前]内容:
declare module 'foo'

タイプ情報はありませんが、TypeScriptコードがコンパイルされるはずです(TypeScriptは「any」タイプのfooモジュールと見なします)。

また、 official doc および/または DefinitelyTyped の例を参照して、自分で型情報を記述しようとすることもできます。そうする場合、モジュールに直接入力するか(モジュール作成者が受け入れる場合はソリューション0)、またはDefinitelyTyped(ソリューション1)に入力することを検討してください。

27
Offirmo

[編集]この回答に感謝します!ただし、2018年の時点では時代遅れです。読者は他の回答をご覧ください。

Npmからモジュールをインポートする方法はいくつかあります。しかし、タイピングが得られない場合、tscは常に、必要なモジュールを見つけることができないと文句を言います(トランスコンパイルされたjs 実際に動作していても)。

  • タイピングがあり、tsconfig.jsonを使用しない場合は、referenceを使用してタイピングをインポートします。

    /// <reference path="path/to/typings/typings.d.ts" />
    
    import * as _ from 'lodash`;
    
    console.log(_.toUpper('Hello, world !'))
    
  • tsconfig.jsonファイルを使用している場合は、必ずタイピングファイルを含めて(または除外せずに選択)、前の例のようにimportを作成してください。

利用可能なタイピングがない場合。 2つの選択肢があります:.d.tsファイルに独自のファイルを作成するか、ライブラリのタイプチェックを無視します。

型チェックを完全に無視するには(これは推奨される方法ではありません)、型anyの変数にライブラリをインポートします。

 const _: any = require('lodash');

 console.log(_.toUpper('Hello, world !'))

tscは、requireが存在しないと文句を言います。 nodeを入力するか、declareを入力してエラーを破棄します。

53
Blackus

おそらく 宣言ファイルが欠落している

詳細については、 DefinitelyTyped を参照してください。


これを試して:

npm install --save lodash
npm install --save @types/lodash

これでインポートできます。

import _ from 'lodash';

インポートするモジュールに複数のエクスポートがある場合、これを行うことができます:

import { Express, Router } from 'express';

インポートするモジュール "デフォルトのエクスポートがない"の場合、これを行う必要があります。

import * as http from 'http';
14
Derek Soike

それは私のために働いた。

  1. 「typings」という名前のフォルダーを作成します。
  2. タイピングフォルダーで、ファイル名module-name.d.tsを作成します。を含む:

    declare module "module-name";

  3. Tsconfig.jsonで、フォルダーを参照します

    "typesRoots": [ "./typings", "../node_modules/@types" ]

2
Quynh Ngo