私はこの数時間、この問題に苦労してきましたが、インターネット上で、おそらくこの単純な概念を明確に説明するものを見つけることができないようです。
現在、Webpack2とTypeScriptを使用するReactJSプロジェクトに取り組んでいます。すべてが1つのこととは別に完全に機能します。自分で作成したインターフェイスをアプリケーション全体に表示されるように別々のファイルに移動する方法を見つけることはできません。
プロトタイピングの目的で、最初はそれらを使用するファイルで定義されたインターフェイスを使用していましたが、最終的には複数のクラスで必要なインターフェイスを追加し始め、すべての問題が発生しました。 tsconfig.json
にどのような変更を加えても、ファイルをどこに置いてもIDEとWebpackはどちらも名前を見つけられないという不満を言います(Could not find name 'IMyInterface'
)。
現在のtsconfig.json
ファイルは次のとおりです。
{
"compilerOptions": {
"baseUrl": "src",
"outDir": "build/dist",
"module": "commonjs",
"target": "es5",
"lib": [
"es6",
"dom"
],
"typeRoots": [
"./node_modules/@types",
"./typings"
],
"sourceMap": true,
"allowJs": true,
"jsx": "react",
"moduleResolution": "node",
"rootDir": "src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": false,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true
},
"exclude": [
"node_modules",
"build",
"scripts",
"acceptance-tests",
"webpack",
"jest",
"src/setupTests.ts"
],
"types": [
"typePatches"
]
}
ご覧のとおり、私のtsconfig.json
はプロジェクトディレクトリのルートにあり、すべてのソースは./src
にあり、カスタム.d.ts
ファイルを./typings
に配置して、 typeRoots
。
TypeScript 2.1.6および2.2.0でテストしましたが、どちらも動作しません。
すべてを機能させる1つの方法は、typings
ディレクトリをsrc
に移動してからimport {IMyInterface} from 'typings/blah'
に移動することですが、使用する必要がないので適切ではありません。これらのインターフェイスは、アプリケーション全体で「魔法のように」利用できるようにしたいだけです。
編集:サンプルapp.d.ts
ファイルは次のとおりです。
interface IAppStateProps {
}
interface IAppDispatchProps {
}
interface IAppProps extends IAppStateProps, IAppDispatchProps {
}
それらをexport
または多分declare
する必要がありますか?名前空間でラップする必要はありませんか?!
「Magically available interface」またはグローバルタイプは非常に推奨されておらず、ほとんどはレガシーに委ねるべきです。また、作成しているコードにアンビエント宣言ファイル(d.ts
ファイルなど)を使用しないでください。これらは、外部の非TypeScriptコードの代わりに使用することを意図しています(本質的にTypeScriptタイプをjsコードに入力して、javascriptとよりよく統合できるようにします)。
作成するコードについては、プレーン.ts
ファイルを使用してインターフェイスとタイプを定義する必要があります。
グローバルタイプは推奨されませんが、問題に対する答えは、TypeScriptには.ts
ファイルの2つのタイプがあるということです。これらはscripts
およびmodules
と呼ばれます。
script
内のすべてのものはグローバルになります。したがって、スクリプトでインターフェイスを定義すると、アプリケーション全体でグローバルに使用可能になります(スクリプトが///<reference path="">
タグ、またはfiles:[]
またはincludes:[]
を介してコンパイルに含まれている場合、または**/*.ts
のデフォルトtsconfig.json
。
他のファイルタイプは「モジュール」であり、module
内のすべてはモジュールに対してプライベートです。モジュールから何かをエクスポートする場合、他のモジュールがそれをインポートすることを選択した場合、他のモジュールで使用できます。
.ts
ファイルを「スクリプト」または「モジュール」にするものは何ですか?ええと...ファイルのどこかでimport/export
を使用すると、そのファイルは「モジュール」になります。 import/export
ステートメントがない場合、それはグローバルスクリプトです。
私の推測では、あなたが宣言でimport
またはexport
を誤って使用し、それをモジュールにして、すべてのインターフェイスをそのモジュール内でプライベートにしたと思います。それらをグローバルにしたい場合は、ファイル内でimport/exportステートメントを使用していないことを確認してください。