2017-06-09 12 views
2

私はtypescript 2.3.4を使用しています。@ types/knockoutグローバル変数 'ko'を公開しません。だから私はタイプを入れました:tsconfig.jsonと私は明示的にko(second.tsのような)をインポートしたいと思います。宣言された関連モジュールがインポートされるとすぐに、すべてのファイルに対してグローバル宣言が使用可能になります。

const obs : KnockoutObservable<string> = ko.observable("hello"); // should raise error TS2304: Cannot find name 'ko'. and error TS2304: Cannot find name 'KnockoutObservable'. 
console.log(obs()); 
: 問題は、私はsecond.tsで行う輸入がfirst.tsためグローバル(KO、KnockoutObservable ...)

first.tsタイプ/ノックアウト@利用できるようにしていることです

second.ts:

import * as ko from "knockout"; // this import makes 'ko' globally available even for first.ts 

export class Foo { 
    bar = ko.observable("bar"); 
} 

tsconfig.json:

{ 
    "compilerOptions": { 
     "module": "commonjs", 
     "target": "es5", 
     "noImplicitAny": true, 
     "sourceMap": false, 
     "declaration": false, 
     "noUnusedLocals": true, 
     "outDir": "dist", 
     "types": [ 
     ] 
    }, 
    "exclude": [ 
     "node_modules", 
     "dist" 
    ] 
} 

完全な解決策はここにあります:https://github.com/kingatlas/typescript-sandbox

どのようにグローバルであることから、KOを防ぐANモジュール(輸入...から)としてそれを使用し続けることができますか?

答えて

1

簡単な方法はありません。 Knockout typingsは、それらをグローバルまたはモジュールとして使用できる広範なパターンに従っています。そのパターンの副作用は、変数koがノックアウトタイピングがコンパイルに含まれるとすぐにグローバルスコープに現れることです。

回避策の1つはsecond.tsfirst.tsをそれぞれ別個にtsconfig.jsonにコンパイルし、後でそれらをbundlerまたはmodule loaderと組み合わせることです。 first.tsが誤ってknockoutをインポートしないようにするには、とtypeRootstsconfigになり、すべての入力がfilesに明示されている必要があります。

別の方法として、ノックアウトの入力をモジュールとして宣言するだけです。再び、typestypeRootstsconfigに空にして、typescriptがnode_moudlesの「間違った」入力にアクセスしないようにする必要があります。

関連する問題