次のようなサードパーティモジュールを宣言するにはどうすればよいですか。
サードパーティモジュール:
module.exports = function foo(){
// do somthing
}
私のコードで:
import * as foo from 'foo-module'; // Can not find a declaration module for ...
foo();
サードパーティのモジュールの使用に関するドキュメント を確認してください。
宣言の記述方法は、モジュールの記述方法とエクスポート内容に大きく依存します。
指定した例はCommonJSモジュール(module.exports = ...
)です。これは実際には有効なES6モジュールではありません。ES6は関数をモジュール(関数メンバーまたはdefault関数のみをエクスポートします。
追加された esModuleInterop
コンパイラオプション を使用すると、非ES6互換のエクスポートを持つCommonJSモジュールに対して、以下に示す「名前空間のハック」を使用する必要がなくなります。
まず、tsconfig.json
(デフォルトでtsc --init
に含まれるようになりました)でesModuleInterop
を有効にしていることを確認します。
{
"compilerOptions" {
...
"esModuleInterop": true,
...
}
}
次のようにfoo-example
ファイルで.d.ts
を宣言します。
declare module "foo-module" {
function foo(): void;
export = foo;
}
これで、必要な名前空間としてインポートできます:
import * as foo from "foo-module";
foo();
または、デフォルトのインポートとして:
import foo from "foo-module";
foo();
次のようにfoo-example
ファイルで.d.ts
を宣言できます。
declare module "foo-module" {
function foo(): void;
namespace foo { } // This is a hack to allow ES6 wildcard imports
export = foo;
}
そして、あなたが望むようにインポートします:
import * as foo from "foo-module";
foo();
またはこのように:
import foo = require("foo-module");
foo();
ドキュメントには、宣言ファイルに関する優れたリソースがあります および一部の さまざまな種類の宣言ファイル用のテンプレート 。
その関数を宣言します:
Var foo:any;を宣言します
これはTypeScriptにfooという関数がどこかにあることを伝え、サイトに確実に挿入されるようにします。
同様の問題がありました。そして、私のプロジェクトに型定義を追加するのに苦労しました。ついに考えました。
これはいくつかのモジュール(定数のみ)で、some-module
-node_modules/some-module/index.jsと呼びます。
'use strict';
exports.__esModule = true;
var APPS = exports.APPS = {
ona: 'ona',
tacq: 'tacq',
inetAcq: 'inetAcq'
};
最初にtsconfig.jsonにbaseUrl
とtypeRoots
を追加します
{
...
"compilerOptions": {
...
"baseUrl": "types",
"typeRoots": ["types"]
}
...
}
次に、プロジェクトルートで、モジュールtypes/some-module/index.js
と同じフォルダー構造を持つフォルダーtypes
を作成し、コードを配置します。
declare module 'some-module' {
type Apps = {
ona: string;
tacq: string;
inetAcq: string;
};
let APPS: Apps
}
最後に、入力してmy-file.ts
にインポートできます!
import { APPS } from 'some-module';