Typescript: モゞュヌルからUMDグロヌバルぞのアクセスを蚱可するこずを怜蚎しおください

䜜成日 2016幎08月05日  Â·  73コメント  Â·  ゜ヌス: microsoft/TypeScript

7125からのフィヌドバックは、䞀郚の人々が実際にグロヌバルUMDラむブラリずむンポヌトされたUMDラむブラリを組み合わせお䞀臎させるずいうものです。

3぀のもっずもらしいオプション

  1. 今日私たちがしおいるこずをしなさい-良い回避策がないので悪い
  2. 䞀郚の構文たたは構成で「このUMDグロヌバルは実際にはグロヌバルに利甚可胜です」ず蚀うこずができたす-やや耇雑ですが、実行可胜です
  3. コンテキストに関係なく、すべおのUMDグロヌバルぞのアクセスを蚱可したす-UMDグロヌバルをファむルにむンポヌトするのを忘れた堎合の゚ラヌを芋逃したす。 これらはおそらくややたれですが、芋逃すのはばかげおいるでしょう

動䜜するように聞こえたすが、おそらく動䜜したせん。

  1. むンポヌトされたUMDモゞュヌルに「グロヌバルでは䜿甚できたせん」のフラグを付けたす-モゞュヌルの拡匵䞭にUMDモゞュヌルが宣蚀ファむルにむンポヌトされるため、䞍良です。 実装ファむルず宣蚀ファむルからのむンポヌトの動䜜が異なるのは奇劙なこずです。

簡単にするためにオプション3を䜿甚する傟向がありたすが、論理的な堎所で䜿甚できる適床に優れた構文たたは構成があれば、オプション2を芋るこずができたす。 TSLintルヌルでUMDグロヌバルの䜿甚を怜出するこずは、誰かがこれを実行したい堎合は簡単です。

前進する1぀の方法は、オプション3を実装するこずであり、「むンポヌトを忘れた」゚ラヌが頻繁に発生する堎合は、蚱可されるUMDグロヌバルを明瀺的に指定するtsconfigオプションglobals: []を远加したす。

Add a Flag Committed Suggestion good first issue help wanted

最も参考になるコメント

これに+1。 私はちょうどSystemJSでReactを䜿おうずしおいたしたが、Reactはうたくバンドルされおいないため、スクリプトタグでCDNから盎接ロヌドしおいるだけなので、React / ReactDOMオブゞェクトはグロヌバルに利甚できたす。

ベストプラクティスずしおコヌドをモゞュヌルずしお蚘述しおいたすが、これはロヌド時に実行される1぀のランタむムスクリプトにバンドルされたすロヌルアップ。 import from react / react-domを実行し、ロヌダヌを「実際には、これらはグロヌバルではありたせん」ず蚀うように構成するのは面倒ですそしお嘘ですhttps/にあるWebPack構成の䟋ず同様 /www.typescriptlang.org/docs/handbook/react-&-webpack.html。 モゞュヌルでこれらをグロヌバルずしお利甚できるようにする方がはるかに簡単か぀正確です。 私が詊した手順は、盎感的に思えたので、次のずおりです。

  1. npm install --save-dev @types/react @types/react-dom
  2. 私のtsconfig.json "jsx": "react", "types": ["react", "react-dom"]
  3. 私のモゞュヌル export function MyComponent() { return <div>{"Hello, world"}</div>; }
  4. 同様に ReactDOM.render(...)

ただし、これにより゚ラヌReact refers to a UMD global, but the current file is a module. Consider adding an import insteadたす。

これがうたく機胜した堎合、これは、モゞュヌルであるコヌドを装っお、そうでないロヌダヌ/バンドラヌを構成するよりもはるかに簡単です。 たたは、以䞋を含むファむルを远加するこずで、期埅どおりの動䜜を実珟したした。モゞュヌルは、゚ラヌなしでグロヌバルずしおReactReactDOMを䜿甚できたすが、少し醜い/ハッキヌです-もっず簡単な方法があるかもしれたせんが逃した

import * as ReactObj from "react";
import * as ReactDOMObj from "react-dom";

declare global {
    var React: typeof ReactObj;
    var ReactDOM: typeof ReactDOMObj;
}

党おのコメント73件

コンテキストに関係なくすべおのUMDグロヌバルぞのアクセスを蚱可する代わりに、UMDモゞュヌルが///<reference types=<>>構文のいずれかを介しお明瀺的に「参照」されおいるむンポヌトされおいない堎合にのみ、UMDグロヌバルぞのアクセスを蚱可する方が簡単ではないでしょうか。 、たたはtsconfig.jsonのtypes構成を介しお

蚀い換えれば、モゞュヌル内で///<reference types=<>>䜿甚を蚱可しないのはなぜですか

/// <reference type="x" />がxが_どこでも_グロヌバルに利甚可胜であるこずを意味するず蚀った堎合、どこかの.d.tsファむルが実際にはグロヌバルではないものを誀っお参照するこずがよくありたすこれは、DefinitelyTypedの2.0ブランチを保守しおいお、非垞に䞀般的な゚ラヌであるためです。

逆に、それが_そのファむルで_しか利甚できない堎合は、参照ディレクティブをあちこちにコピヌしお貌り付ける必芁があり、これは本圓に面倒です。 これらのディレクティブは通垞べき等であるため、ファむル固有の動䜜を導入するのは奇劙です。

そうですか。 たあ、これが他の誰にも圱響を䞎えおいないのであれば、おそらく珟圚の動䜜を維持する方が良いでしょう。 モゞュヌルずしおのむンポヌトに完党に移行する必芁がありたす。

線集これが私以倖の倚くの人々に圱響を䞎えるのを芋おうれしいです。

珟圚の理論は、モゞュヌルの䜿甚に移行するかどうかを人々に求めるこずです。 他の人がこれに遭遇した堎合は、詳现を調査できるように、䜿甚しおいたラむブラリを正確にコメントに残しおください。

私はlodashを䜿甚しおいたすが、これには独自のタむピングは付属しおいたせん。 たた、ランタむム環境で盞察パスむンポヌトステヌトメントを䜿甚するのが最も簡単な状況もありたす。 したがっお、むンポヌトステヌトメントずロヌカル盞察パスおよびフォルダヌ盞察「./foo」および「N / bar」の組み合わせがありたす。

@types/lodash/index.d.tsをnode_modules/lodash/に手動でコピヌするず、タむプチェックを行うこずができたす。

これたでの私の回避策は///<amd-dependency path='../lodash' name="_">  importステヌトメントは䜿甚しおいたせん../lodash が残りたす。

これがこの問題に十分近いシナリオであるこずを願っおいたすか

明確にできたすか

たた、ランタむム環境で盞察パスむンポヌトステヌトメントを䜿甚するのが最も簡単な状況もありたす。

そしお

@types/lodash/index.d.tsをnode_modules/lodash/に手動でコピヌするず、タむプチェックを行うこずができたす。

お願いしたす 私はこのシナリオに粟通しおいないので、これの目的は䜕ですか、そしおなぜそれが圹立぀のですか

こんにちは、みんな、

珟圚の@types/bluebird宣蚀の問題の解決策を探しおいたす時間をかけお読んではいけたせん。 .d.tsにexport as namespace Promise;を远加するこずで問題を解決できるこずがわかりたしたが、このgithubの問題で説明されおいる問題が発生したした。

芁するに、私は以䞋を機胜させたいのです。

  1. git clone -b vanilla-es5-umd-restriction-problem https://github.com/d-ph/typescript-bluebird-as-global-promise.git
  2. cd typescript-bluebird-as-global-promise
  3. npm install
  4. export = Bluebird;行の䞊にexport as namespace Promise;远加しお、 node_modules/@types/bluebird/index.d.ts線集したす。
  5. npm run tsc

珟圚の結果
いく぀かの'Promise' refers to a UMD global, but the current file is a module. Consider adding an import instead.゚ラヌ。

期埅される結果
コンパむルは成功したす。

この問題は、開発者のコ​​ヌドずサヌドパヌティのコヌドこの堎合はRxJSの䞡方でのPromise䜿甚によっお匕き起こされるため、特に困難です。 埌者は、 PromiseがグロヌバルJS暙準で提䟛であるず想定しおいるため、たずえばimport Promise from std; // (not that "std" is a thing)を䜿甚するように倉曎されるこずはありたせん。

UMDモゞュヌルをむンポヌト可胜なモゞュヌルずグロヌバルの䞡方ずしお䜿甚する方法を本圓に感謝しおいたす。

ありがずう。

-----------------------------曎新

私はこの問題を別の方法で解決するこずになりたした぀たり、 PromiseずPromiseConstructorむンタヌフェむスの拡匵によっお。

"globals": [] tsconfigオプションは、どこにでも衚瀺するよりも望たしいようです。 UMD宣蚀が暙準になり぀぀あるため、誀っおモゞュヌルのむンポヌトを忘れる可胜性が高くなっおいたす。 珟圚の動䜜を維持するこずを怜蚎しおください。 これぱラヌであるはずです。

逞話的に、ポむントリリヌスでグロヌバルなwindow.moment倉数が削陀されたずきのこずを芚えおいたす。 どこにでも䞁寧に茞入しおいるず思っおいたのですが、5か所くらい忘れおいたした。

もちろん、UMDパッケヌゞは実行時にグロヌバルスコヌプで䜿甚可胜になりたすが、い぀䜿甚可胜になるかは、他のモゞュヌルがロヌドされる順序によっお異なりたす。

これに+1。 私はちょうどSystemJSでReactを䜿おうずしおいたしたが、Reactはうたくバンドルされおいないため、スクリプトタグでCDNから盎接ロヌドしおいるだけなので、React / ReactDOMオブゞェクトはグロヌバルに利甚できたす。

ベストプラクティスずしおコヌドをモゞュヌルずしお蚘述しおいたすが、これはロヌド時に実行される1぀のランタむムスクリプトにバンドルされたすロヌルアップ。 import from react / react-domを実行し、ロヌダヌを「実際には、これらはグロヌバルではありたせん」ず蚀うように構成するのは面倒ですそしお嘘ですhttps/にあるWebPack構成の䟋ず同様 /www.typescriptlang.org/docs/handbook/react-&-webpack.html。 モゞュヌルでこれらをグロヌバルずしお利甚できるようにする方がはるかに簡単か぀正確です。 私が詊した手順は、盎感的に思えたので、次のずおりです。

  1. npm install --save-dev @types/react @types/react-dom
  2. 私のtsconfig.json "jsx": "react", "types": ["react", "react-dom"]
  3. 私のモゞュヌル export function MyComponent() { return <div>{"Hello, world"}</div>; }
  4. 同様に ReactDOM.render(...)

ただし、これにより゚ラヌReact refers to a UMD global, but the current file is a module. Consider adding an import insteadたす。

これがうたく機胜した堎合、これは、モゞュヌルであるコヌドを装っお、そうでないロヌダヌ/バンドラヌを構成するよりもはるかに簡単です。 たたは、以䞋を含むファむルを远加するこずで、期埅どおりの動䜜を実珟したした。モゞュヌルは、゚ラヌなしでグロヌバルずしおReactReactDOMを䜿甚できたすが、少し醜い/ハッキヌです-もっず簡単な方法があるかもしれたせんが逃した

import * as ReactObj from "react";
import * as ReactDOMObj from "react-dom";

declare global {
    var React: typeof ReactObj;
    var ReactDOM: typeof ReactDOMObj;
}

オプション3ずグロヌバルにも同意したす[]バックアップ。 これは、新旧のナヌザヌにはかなり盎感的に思え、人々が必芁ずする正確な機胜を提䟛したす。

私はコヌドの専門家ではないので、2がより奜たしいかどうかはわかりたせんが、構成が単玔であるため、盎感的にも理解できるず思いたす。

これらのいずれかを実装するための支揎を怜蚎したい堎合は、どこに行けばよいですか

これは本圓に旗の埌ろにあるはずです。 これは倧芏暡なリファクタリングの危険です。 フラグがデフォルトでtrueに指定されおいる堎合でも。 これは元のシナリオで匕き続き機胜する必芁があるず思いたす。そうしないず、UMD宣蚀の䞻な利点が倱われたす。

Reactはうたくバンドルされおいたせん

@billti詳しく説明しおいただけたすか

import from react / react-domを実行し、ロヌダヌを「実際にはそうではない、これらはグロヌバルです」ず蚀うように構成するのは苊痛そしお嘘です。

チュヌトリアルでそれを曞いた唯䞀の理由は、 externalsを䜿甚するずバンドル時間が短瞮されるためです。 むンポヌトせずにグロヌバルReact倉数を䜿甚する堎合、埌でモゞュヌルに簡単に切り替えるこずはできたせんが、むンポヌトを䜿甚するず、任意のロヌダヌを柔軟に䜿甚できたす。

バンドルを最適化しようずしおいる方法ず芳察されたサむズの䟋に぀いおは、この問題https://github.com/rollup/rollup/issues/855を参照しおください。 事実䞊、ロヌルアップを䜿甚したセットアップでは、Reactをバンドルするこずで最小限のサむズの増加が芋られたので、CDNから提䟛したいず思いたす。 私にずっお、これには次の利点がありたす。

a私のサむトぞのリク゚ストおよび垯域幅が少なくなりたす。
bビルドチェヌンにバンドルするのにかかる時間が短瞮されたした。
c倉曎をプッシュするたびにクラむアントに再ダりンロヌドするコヌドが少なくなりたす再ダりンロヌドされるバンドルにはコヌドのみが含たれ、Reactは倉曎されずにクラむアントキャッシュにあるため、304が取埗されたす。

サむトの読み蟌み時にChrome開発ツヌルを芋るず、GZipped HTTP接続のReactずReact-dom瞮小版はわずか47kbのネットワヌクトラフィックであり、サむト䞊のほずんどの画像よりも少ないので、私はそうではありたせんずにかくそれほど倧きな利益が埗られない限りたずえば50の削枛、それだけ削枛しようずするこずを心配しおいたした。

補遺ずしおTypeScriptコンパむラ自䜓には「このモゞュヌルは本圓にグロヌバルです」ず蚀うための構成がないため、このオプションがないず、これらのむンポヌトを排陀するバンドラヌを䜿甚するように匷制されるこずにも泚意しおください。実行時に解決されないモゞュヌルのむンポヌトたたは芁求、定矩を発行したす。

@billti SystemJSは、このシナリオを完党にサポヌトしおいたす。 開発䞭にロヌカルにむンストヌルされたパッケヌゞを䜿甚するこずず、本番環境でCDNを䜿甚するこずを切り替えるこずができたす。 たた、すべおのむンポヌトが、䞀床フェッチされ、最初に必芁になったずきにりィンドりオブゞェクトにアタッチされるグロヌバル倉数ぞの参照を実際に瀺す必芁があるこずを指定するメタデヌタも完党にサポヌトしおいたす。本番環境では、これはCDNから取埗できたす。 私はこれをreactで実行しおいたせんが、Angular1.xで実行したした

ありがずう@aluanhaddad 。 興味深い...私は実際に、この障害に぀ながるような䜕かを機胜させようずしおいお、それを理解できなかったので、今朝、SystemJSリポゞトリで質問したした。 https://github.com/systemjs/systemjs/issues/1510を達成する方法に答えるこずができれば、それは本圓に圹に立ちたす:-)

泚コヌドを実行するためにむンポヌトをグロヌバルにマップするには、SystemJS / WebPack / Rollupなどのようなものが必芁なため、TypeScript自䜓によるemitはこれなしでは䜿甚できないずいう他のコメントはただ残っおいたす。

私は実際の䟋を䜜るこずができるかどうか芋おみたす、私はそれをかなり長い間しおいたせん、そしお私はその時に持っおいた゜ヌスコヌドにアクセスできたせんが、私は100パヌセント確信しおいたすそれが可胜だ。

2぀目のポむントずしお、これはたさにSystemJSが行うこずです。 これらのむンポヌトをグロヌバルにマップし、グロヌバルが実際に芁求されおおり、すでにロヌドされおいるこずを理解したす。 出力は間違いなく䜿甚可胜です

参考SystemJS APIを䜿甚しおSystemJSでこれを機胜させ、 https//github.com/systemjs/systemjs/issues/1510に゜リュヌションを远加したした。 ありがずう。

私の2番目のポむントに぀いおはい、それがたさにロヌダヌができるこずだず私は知っおいたす。 それが私のポむントです。むンポヌトされたモゞュヌルをグロヌバルにマップできたすが、TypeScriptはマップできたせん。そのため、実行時にコヌドを有効にするにはロヌダヌを䜿甚する必芁がありたす。 したがっお、この元の問題のキャッチ22であり、グロヌバルこの堎合はReactがモゞュヌルで䜿甚可胜であるこずを宣蚀できない堎合は、モゞュヌルであるかのようにむンポヌトする必芁がありたすそうではありたせん。 。

私の他のコメントは、コヌドを実行するためにむンポヌトをグロヌバルにマップするためにSystemJS / WebPack / Rollupなどのようなものが必芁なため、TypeScript自䜓によるemitはこれなしでは䜿甚できないずいうこずです。

@billtiわかりたせん。 モゞュヌルのグロヌバルバヌゞョンを䜿甚するこずが唯䞀のオプションであるが、TypeScriptではそれができないシナリオは䜕ですか ラむブラリがグロヌバルずモゞュヌルの䞡方ずしお利甚できるシナリオを芋ただけです。

@DanielRosenwasser圌は、Reactがロヌドされる方法のために、グロヌバルオブゞェクトのメンバヌのように、実行時に実際にはグロヌバルであるこずを意味しおいるず思いたす。

@billtiあなたがそれを

あなたの2番目のポむントに぀いお私はあなたが䜕を意味するのかわかりたす。

私の感じでは、ブラりザヌのシナリオでは、RequireJSのようなロヌダヌたたはWebpackのようなパッケヌゞャヌを䜿甚する必芁があるため、モゞュヌルをサポヌトするブラりザヌはただないため、違いはありたせん。 チャクラは旗の埌ろでそれを利甚できるず聞きたした。 したがっお、远加のツヌルがなければ、コヌドを実行する方法はたったくありたせん。 define 、 require 、たたはSystem.registerを含む出力が、出力された_JavaScript_コヌドを移怍できない可胜性が高いこずを意味したす。 ただし、「モゞュヌルずモゞュヌルではない」の区別の重芁性はわかりたす。

この回避策を䜿甚しお、少なくずも「モゞュヌル」を1回だけ参照できたす。

_shims.d.ts_

import __React from 'react';

declare global {
  const React: typeof __React;
}

そうすれば、むンポヌトせずに他の堎所で䜿甚できたす。
たた、Reactがグロヌバルになったこずを蚀っおいるので、少し厄介な堎合でも、これは非垞に明確です。これは、Reactをむンポヌトする必芁がなくなった理由でもありたす。

あなたのshims.d.tsに関しお、あなたがいく぀かの投皿を䞊に行くならば、あなたはそれが今のずころ私がしたこずであるこずがわかるでしょう偉倧な心は同じように考えたす;-)

私はそれをいく぀かの方法の1぀で機胜させるこずができたすが、それは重芁ではありたせん。 TypeScriptを簡単に採甚できるようにし、ナヌザヌを絶望の萜ずし穎ではなく成功の萜ずし穎に陥らせようずしおいたす。 そのこずを念頭に眮いお、TypeScriptを䜿おうずしお問題が発生した堎合、私はよく2぀の質問をしたす。aこれは有効なコヌドですか。b顧客はこれを詊しおみようずしおいたすか。

TypeScript以倖のバヌゞョンがBabelでやりたいこずを、入力にかかる時間ずほが同じ時間で実行しおいたこずを考えるず、コヌドは有効であるず蚀っおも過蚀ではありたせん。 ReactドキュメントのむンストヌルペヌゞにCDNのスクリプトタグを

TypeScriptがコヌドを曞く特定の有効なパタヌンをサポヌトしない堎合は、それをすぐに明らかにしお、人々を正しく導くようにする必芁がありたすこれぱラヌメッセヌゞや簡朔なドキュメントで行うのが難しいこずです。 しかし、個人的には、TypeScriptがパタヌンをサポヌトするべきではないず思いたす。なぜなら、パタヌンが「ベストプラクティス」たたは「暙準的」であるずは思わないからです。 コヌドが有効で、䞀郚のJavaScript開発者がコヌドを蚘述したい堎合は、TypeScriptでサポヌトを詊みる必芁がありたす。 TypeScriptを機胜させるために、コヌドを倉曎し、ビルドパむプラむンを再構成する必芁があるほどここでは、些现なアプリを移行するこずをお勧めしたす、開発者の移動は少なくなりたす。

解決策に぀いおは...ここで唟を吐くだけですが、プロゞェクト党䜓で䜿甚できるAPIをすでに効果的に定矩しおいる「lib」コンパむラオプションも、ラむブラリがグロヌバルに远加するために@types/name圢匏の倀を取る可胜性がありたすそしおおそらく盞察パスもサポヌトしたす。

TypeScriptを簡単に採甚できるようにし、ナヌザヌを絶望の萜ずし穎ではなく成功の萜ずし穎に陥らせようずしおいたす。

私たちは今、ナヌザヌを成功の萜ずし穎に導こうずしお

  1. モゞュヌルによっおむンポヌトされおいない堎合にのみ衚瀺される、拡匵されたexport as namespace foo構造を䜜成したす。
  2. 䜕もせず、むンポヌトを䜿甚するように人々にプッシュし続けたす-ずにかく゚ラヌメッセヌゞを合理的に芏範的にしたので、これは私の意芋では倚かれ少なかれ問題ありたせん。
  3. 人々がどこからでもUMDを䜿甚できるようにしたす-私は正盎なずころ、このアむデアに぀いおはそれほど倧きくありたせん。

@billti

あなたのshims.d.tsに関しお、あなたがいく぀かの投皿を䞊に行くならば、あなたはそれが今のずころ私がしたこずであるこずがわかるでしょう偉倧な心は同じように考えたす;-)

申し蚳ありたせんが、私はそれを逃したした、ずおも玠敵です;

TypeScriptがパタヌンをサポヌトするべきではないず思いたす。なぜなら、それらは「ベストプラクティス」たたは「暙準的」であるずは思わないからです。

TypeScriptがここで芏範的であるずは思わない、私はそれが䞻匵するこずをしおいるず思う、私に゚ラヌがあるず私に告げる。 倚くのラむブラリには、グロヌバルずしお自分自身をロヌドしおからESモゞュヌル構文の䜿甚に進むデモずチュヌトリアルがありたす。 そうするこずで圌らが最高の垂民になったずは思いたせんが、それはたた別の議論です。

ずは蚀うものの、モゞュヌルが䞻にグロヌバル䞊で_知芚される_構文糖衣構文ずしお䜿甚される堎合、それらは構文糖衣構文ではないため、倱敗はすぐそこにありたす。 どちらかずいえば、それらは構文䞊の塩おそらく皎金であり、真のコヌド分離、スクリプトタグの順序付けからの解攟、明瀺的な䟝存関係の宣蚀、グロヌバル名前付け地獄からの脱出などの利点のために消費したす。 モゞュヌルの構文は人間工孊的ではなく、せいぜい冗長ですが、モゞュヌルのセマンティクスが䟡倀のあるものになっおいたす。

少なくずも.tsファむルでTypeScriptを䜿甚しおいる堎合は、匷力な静的コヌド分析のメリットを享受したいず考えおいたす。 バベルは、Reactが存圚するが、それに぀いおの知識がないず仮定しお、これを行いたせん。 これは、ESモゞュヌルが静的解析に適しおいるように意図的に指定されおいる堎合でも圓おはたりたす。

@DanielRosenwasser

モゞュヌルによっおむンポヌトされない堎合にのみ衚瀺される名前空間foo構造ずしお拡匵゚クスポヌトを䜜成したす。

これを解決する最良の方法のように思えたす。

これが問題を匕き起こした別のケヌスは次のずおりです。

私が珟圚取り組んでいるプロゞェクトでは、ロヌカルむンクルヌド䞻に歎史的な理由でずnpmモゞュヌルを組み合わせおいたす。 最終的には、RollupたたはBrowserifyを䜿甚しおすべおが結合されるため、問題ありたせん。

コヌドベヌスにコピヌしただけのemojioneプロゞェクトの.jsファむルを䜿甚したす。 埌で、その型宣蚀をDefinitelyTypedに远加したした。https 

npmモゞュヌルに移行しない理由は、npmモゞュヌルにも数メガバむトのスプラむトずPNGがバンドルされおいるためです。 その1぀の200KiBスクリプトが必芁です。 型宣蚀あり。

AngularJSの堎合、回避策はdeclare var angular: ng.IAngularStatic 。 しかし、それは名前空間では機胜したせんよね

@dbrgn別の問題が発生しおいたす。 モゞュヌルが実際にグロヌバルである堎合、タむプ定矩は正しくありたせん。 グロヌバルを宣蚀するこずも、UMDスタむル宣蚀これはUMDスタむル宣蚀に関するものですでもありたせん。実際には、玔粋なESモゞュヌルのみを宣蚀したす。

モゞュヌルがグロヌバルを衚す堎合は、ファむルの最䞊䜍で゚クスポヌトしないでください。これにより、モゞュヌルがモゞュヌルになりたす。

AngularJSでは、回避策はvarangularng.IAngularStaticを宣蚀するこずでした。 しかし、それは名前空間では機胜したせんよね

名前空間で機胜したす。

蚭蚈䌚議での議論の結果、UMDを垞に蚱可し、珟圚の制限を適甚するフラグを远加するこずを怜蚎したした。 この制限は、UMDグロヌバルからタむプにアクセスする堎合にも拡匵されたす。

これに぀いおもっず考えおみおも、新しい宣蚀の皮類を䜜成する方がよいず思いたす。 このフラグは、宣蚀ファむルの䜜成者が1回だけ曞き蟌む必芁がある新しい構文よりも怜出されにくくなっおいたす。

これは、既存のコヌドずツヌルにどうしおも必芁です。 そのような時たで、Javascriptは高速で再生を停止し、モゞュヌルシステムで負けるたで、存圚するコヌドを柔軟に凊理する必芁がありたす。 譊告を発したすが、ビルドを倱敗させないでください。 私は、レガシヌコヌドをロヌルアップずタむプスクリプトでうたく機胜させるこずに察凊するこずに䜕日も無駄にしおきたした。

UGH。

Javaを笑うのが奜きな人はたくさんいるず思いたすが、基本的なJavaモゞュヌルは少なくずも機胜したす。 瓶は働く

14の異なるアドホックモゞュヌル暙準に適合させる必芁はありたせん。たたは、その日のロヌルアップ/バンドルツヌルが実際に消費する圢匏の゜ヌスファむルからjsモゞュヌルをコンパむルしおみお、モゞュヌル圢匏を生成する必芁もありたせん。これは、Typescriptのむンポヌト/゚クスポヌトステヌトメントずサヌドパヌティのd.tsファむルでうたく機胜するため、TSCは、「ダヌンむンポヌトを䜿甚するだけで、グロヌバルなATになる」ず蚀うのではなく、実際にコヌドをビルドするこずを決定したす。実行時間」。

shims.d.tsハックはうたく機胜したす。 しかし、うん。

Webpackを䜿甚しおいる人のための䞀時的な解決策https://github.com/Microsoft/TypeScript/issues/11108#issuecomment-285356313

目的のUMDグロヌバルを䜿甚しおexternalsをwebpack.config.js远加したす。

    externals: {
        'angular': 'angular',
        'jquery': 'jquery'
        "react": "React",
        "react-dom": "ReactDOM"
    }

これにより、既存のコヌドベヌスの移行が容易になるはずです。

jQueryがグロヌバルずしお含たれおいるrequirejsで実装されたプロゞェクトがありたす。これは、グロヌバルずしお芋぀かった堎合にのみjQueryを拡匵するプラグむンがいく぀かあるためです。

䞀郚のモゞュヌルのコヌドはそのプラグむンに䟝存しおおり、jQueryがモゞュヌルずしおむンポヌトされた堎合は䜿甚できたせん。 これを機胜させるには、モゞュヌルずしおロヌドされたjQueryで動䜜するようにすべおのプラグむンを倉曎し、モゞュヌルずしおもロヌドする必芁がありたす必芁な堎所を掚枬したす。

その䞊、モゞュヌルロヌダヌなしでjavascriptを䜿甚するペヌゞもありたす。 したがっお、プラグむンはグロヌバルずモゞュヌルの䞡方で機胜する必芁がありたす。

jQueryずは別に、ノックアりトなどの同じ問題を持぀他のスクリプトがありたす。 これにより、プロゞェクトの移行が簡単になりたす。 たたは、珟実的な芳点からは、実行䞍可胜です。

もちろん、これは最良のパタヌンではなく、新しいプロゞェクトでは䜿甚したせん。 しかし、この問題を抱えおいるのは私だけではないず思いたす

これにtsconfig.jsonでtypesを䜿甚するのは理にかなっおいたすか たずえば、 types蚭定されおいない堎合、珟圚の暗黙的な動䜜が埗られ、 types蚭定されおいる堎合、文字通り「これらはグロヌバルです」ず蚀っおおり、UMD名前空間をグロヌバルに衚瀺させるこずができたす。 それはずにかく今日存圚する䞀皮の振る舞いですグロヌバルな力を陀いお。 これは、新しいglobalsオプションを導入するこずずは察照的です。

それはいい考えだず思いたす。 私の堎合、UMDラむブラリをグロヌバルずしお䜿甚するスクリプトず、モゞュヌルずしお䜿甚するスクリプトがありたす。 それぞれのケヌスに察凊する2぀の異なるtsconfig.jsonを䜿甚しお、この問題を解決できたす。 本圓にたっすぐです。

@blakeembrey typesするこずは理にかなっおいたすが、すでに問題があるため、オヌバヌロヌドの抂念にはあたり熱心ではありたせん。 たずえば、 <reference types="package" />構造には、 "paths"サポヌトしないずいう制限がすでにありたす。 "package"は、 @types内のフォルダヌ名を

この䌚話の埌、私は苊劎しおいたす。 これに関する曎新たたは蚈画された解決策はありたすか これは、lodashがアプリケヌションにずっお䞍可欠な郚分である堎合や、りィンドりに䟝存するだけでなく、より倚くのサヌドパヌティラむブラリがよりモゞュヌル化された構造に倉換される堎合などのシナリオで圹立぀可胜性があるようです。

これに察凊する、たたは少なくずも珟圚利甚可胜なリリヌスでこれをどのように解決する必芁があるかを文曞化するための蚈画された方法はありたすか

こんにちは@mochawichReactを倖郚ずしお定矩し、 declare global構文を䜿甚しないず、次の゚ラヌが発生したす。

TS2686: 'React' refers to a UMD global, but the current file is a module. Consider adding an import instead.

@cantuxTypeScriptはWebpack構成を読み取りたせん。 Reactをグロヌバルに利甚できるようにした堎合は、それをdeclareできたすが、モゞュヌルを䜿甚しないのはなぜですか

@aluanhaddadは、䞻にむンポヌト呌び出しによっお行われた䜜業ず混同されたためです。 私はいく぀かいじりたした、次のステヌトメントは正しいですか

モゞュヌルをむンポヌトする際に、少額のリク゚スト料金を支払っおいたす。 これにより、䜿甚しおいるものがメモリ内で䜿甚可胜になりたす。以前に芁求された堎合、モゞュヌルはキャッシュからロヌドされ、モゞュヌルが存圚しない堎合はフェッチされたす。 このリク゚ストを回避したい堎合は、䜕かをグロヌバルずしお定矩するだけで、Typescriptはそれが利甚可胜であるこずを盲目的に信頌したすスマヌトバンドラヌを䜿甚する堎合は、むンポヌトステヌトメントを眮き換えたり削陀したりするこずもできたす。

これらが正しければ、簡朔にするためにコメントを削陀できたす。スレッドはそのたたでは巚倧です。

@codymullinsが䞊蚘で尋ねたように、誰かがこの問題の珟圚の回避策を芁玄できたすか lodashタむプの定矩を曎新したずころ、TS2686゚ラヌがたくさん発生したした。

私の珟圚の回避策は、typedefファむルをハックしお叀い動䜜暙準に準拠させるこずでしたが、より倚くのtypedefファむルが壊れ始めた堎合、それは実行可胜ではありたせん。

私のシナリオは次のずおりです。

  • シングルペヌゞアプリでは、いく぀かのラむブラリlodashを含むをむンポヌトしたす。

䞊蚘のshimの䟋は機胜したすが、vscodeぱラヌずしお匷調衚瀺しおいたすそれでも正垞に完了したす

モゞュヌルでUMDグロヌバルにアクセスするずきに゚ラヌを出さないでください。 私が取り組んでいる倧芏暡なプロゞェクトはAngularJSで行われ、アプリケヌションにTypescriptを䜿甚しおいたすが、もちろん、 angular UMDグロヌバルタむプず@types/angular Angularタむプに぀いお知るにはTypescriptが必芁です。 あなたはそれが远加ず同じように簡単になるず思うだろう"angular"するtypesでtsconfig.json 、しかし、䜕らかの理由で、それはない、ずTSCは私に叫びたす。 すべおのNPMパッケヌゞが玔粋なTypescriptであるずいいのですが、それらのほずんどはプレヌンなJSであり、非垞に長い間䜿甚されたす。 d.tsをむンポヌトしたずきに、UMDグロヌバルが存圚するず蚀っおTSCがシャットダりンできない理由がよくわかりたせん。 この状況は䞀般的ではありたせん。これたでに取り組んだすべおのTypescriptプロゞェクトでは、少なくずも1぀のJSラむブラリを䜿甚しおおり、自分でバンドルしお、型定矩を䜿甚しお参照する必芁がありたす。

これに関する曎新はありたすか

私のナヌスケヌスCDNを倚甚する既存の倧芏暡なコヌドベヌスに取り組んでいたす。 䞀般的なナヌティリティは、スクリプトタグを介しお倚くのペヌゞclipboardjs、lodashなどにむンポヌトされたす。 これらのグロヌバル倉数はペヌゞで入手できるので、参照したいず思いたす。 モゞュヌルを䜿甚せずに、関連する゜ヌスファむルの先頭に/// <reference type="$name" />を䜿甚しお、typescriptをコンパむルするのは簡単です。 ただし、モゞュヌルを䜜成しようずするず、これは機胜しなくなりたす。

スレッドでは2぀のアプロヌチが提案されおいるようです。

  1. /// <reference type="$name" />むンポヌトトヌクンを珟圚のファむルの名前空間にのみ入れたす。

  2. tsconfig.jsonのコンパむラオプション/構成倉数䟋 "globals" 、 "types" 

どちらのアプロヌチも良いず思いたす。 @RyanCavanaughによるオプション1の批刀には同意したすが

逆に、そのファむルでのみ䜿甚できる堎合は、参照ディレクティブをコピヌしお貌り付ける必芁があり、これは非垞に面倒です。

珟圚の動䜜のために、UMDグロヌバルず䞀緒にモゞュヌルを䜿甚できないこずははるかに厄介だず思いたす。 いく぀かの回避策は、䜕もないよりはたしです。

この問題はただ未解決ですか もしそうなら、珟圚の回避策は䜕ですか

@typesパッケヌゞをむンストヌルするず、モゞュヌルずしおむンポヌトされおいないパッケヌゞがグロヌバルずしお利甚できるようになりたす。

たずえば、プロゞェクトのルヌトにnpm install -D @types/underscoreがある堎合、アンダヌスコアから䜕もむンポヌトしないモゞュヌルを蚘述できたすが、 _グロヌバルは䜿甚可胜になりたす以䞋を参照。

types-ref

それはあなたが求めおいるものですか

@billti誀解しおいるかもしれたせんが、あなたの䟋は私には

再珟に最䜎限必芁なもの

js / foo.ts

// <reference types="js-cookie">

import { Bar } from "./bar";

const Foo = {
    set: function() {
        Cookies.set("foo", "bar");
    },
    get: function() {
        console.log(Cookies.get("foo"));
    }
};

window.onload = function() {
    console.log(Cookies);
}

js / bar.ts

const Bar = {
    x: 3
};

export { Bar };

package.json

{
  "name": "foo",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "private": true,
  "devDependencies": {
    "@types/js-cookie": "^2.1.0",
    "typescript": "^2.7.1"
  },
  "dependencies": {
    "http-server": "^0.11.1"
  }
}

tsconfig.json

{
    "compilerOptions": {
        "module": "system"
    },
    "files": [
        "js/foo.ts"
    ]
}

゚ラヌメッセヌゞ

js / foo.ts7,3゚ラヌTS2686 'Cookies'はUMDグロヌバルを参照しおいたすが、珟圚のファむルはモゞュヌルです。 代わりにむンポヌトを远加するこずを怜蚎しおください。
js / foo.ts10,15゚ラヌTS2686 'Cookies'はUMDグロヌバルを参照しおいたすが、珟圚のファむルはモゞュヌルです。 代わりにむンポヌトを远加するこずを怜蚎しおください。
js / foo.ts15,14゚ラヌTS2686 'Cookies'はUMDグロヌバルを参照しおいたすが、珟圚のファむルはモゞュヌルです。 代わりにむンポヌトを远加するこずを怜蚎しおください。

取埗する動䜜は、むンポヌトされたモゞュヌルが「適切な」UMDモゞュヌルこれは「Cookie」を䜿甚した動䜜ずしお䜜成されたか、「同時に双方向で機胜する」モゞュヌルlodashの䜜成方法ずしお䜜成されたかによっお異なりたす。 。

オブゞェクトが実行時にどのように機胜するかを説明する.d.tsファむルを正しく曞き蟌む人々の䞍䞀臎、および開発者の゚クスペリ゚ンスの䞍透明さは、私が「UMDグロヌバル制限の削陀」の方向にかなり傟いおいる理由です。 --noStrictUMDオプトアりトするず、 --strict䞋に眮くこずができたす。

私が遭遇したもう1぀のこずは、MonacoのカスタムAMDロヌダヌを扱っおいたこずです。 これらのモゞュヌルはに正しくロヌドに倱敗し、 '必芁のグロヌバルずを参照する傟向があるので、圌らはそれはそれで正しいUMDモゞュヌルを䜿甚するのはずおも難しいので、「必芁」グロヌバルに巚倧eyeroll INSERTAMD行動のいく぀かのサブセットをサポヌトしたすが、ストンプモナコモゞュヌルロヌダヌ。 最終的にUMDJSラむブラリをMonacoロヌダヌのスクリプトタグの䞊に配眮するず、モゞュヌルMonaco APIをむンポヌトする必芁がありたすからグロヌバルにアクセスしおいるため、TSが文句を蚀いたす。

@RyanCavanaugh

私が遭遇したもう1぀のこずは、MonacoのカスタムAMDロヌダヌを扱っおいたこずです。 それらはAMDの動䜜のサブセットをサポヌトしたす巚倧なアむロヌルを挿入したすが、グロヌバルな「require」を螏みにじるので、適切なUMDモゞュヌルを䜿甚するのは非垞に困難です。これらのモゞュヌルは「require」をグロヌバルに認識し、適切にロヌドできないためです。モナコモゞュヌルロヌダヌ。

😁

圌らがそれを修正する可胜性はありたすか

私は最近、モゞュヌルの耇雑さのコストに぀いお倚くのこずを考えおきたした。 非垞に倚くの盞互䟝存し、郚分的に互換性のあるロヌダヌ、バンドラヌ、トランスパむラヌ、パッケヌゞマネヌゞャヌ、およびフレヌムワヌクは、真に重芁な量の認定の耇雑さになりたす。 私はあなたが䜕もリマむンダヌを必芁ずしないず確信しおいたす🙉。

開発者ずしお、5〜6幎前よりも桁違いに耇雑なツヌルチェヌンを受け入れたした。耇雑さの䞻な原因はモゞュヌルです。

これらのUMDパッケヌゞをあきらめおグロヌバルずしおロヌドし始めた堎合、それは䜕のためにあるのでしょうか。

それでも...人々はたさにそれをやっおいたす。 これはひどいです

぀たり、このStack Overflow Answerには61👍があり、過去半幎間のパッケヌゞの99ですべおの間違ったこずを瀺唆しおいたす。 著者は、今朝提䟛されたフィヌドバックのために、モゞュヌルをUMD䟝存関係の_オプション_ずしお蚀及するように芪切に曎新したした

これは、これらすべおが順調に進んでいお、グロヌバルに戻るこずを蚱すこずはできたせん

それでも...人々はたさにそれをやっおいたす。 これはひどいです

問題は、JSモゞュヌルの構想ず実装がひどく䞍十分であるため、グロヌバルの䜿甚に戻る方がはるかに優れおおり、簡単であるずいうこずです。 モゞュヌルが最初から適切に蚭蚈および実装されおいた堎合...

モゞュヌルずUMDグロヌバルを組み合わせるのは、さたざたなロヌダヌずの互換性のレベルが異なるモゞュヌルずしお䟝存関係をロヌドするのが面倒であり、盎接の䟝存関係のバンドルをサポヌトしおいない䞀郚のロヌダヌを䜿甚する必芁があるためです。代わりに、実行する分。

この「機胜」は、実際にはUMDモゞュヌルを䜿甚しおいるにもかかわらず、公匏のUMDモゞュヌルサポヌトを䜿甚しおいないこずを意味したす。 .d.tsファむルからグロヌバルずしお゚クスポヌトし、すべおを再゚クスポヌトするその名前の独自のモゞュヌルを手動で䜜成したす。

これに関する曎新はありたすか 私は本圓にオプション2を機胜させたいです

「このUMDグロヌバルは実際にはグロヌバルに利甚可胜です」ず蚀う構文たたは構成を蚱可したす

たた、昔ながらのスタむルのjsラむブラリがたくさん出おいるのも助けにはなりたせん
そこで、それらすべおを曞き盎すこずは問題倖です。 しっかりしたものを䜜るだけ
Rollupがそれらをすべお正しく凊理するように蚭定するず、䜕時間も無駄になりたす。

人々は「゚ンタヌプラむズJava」を笑いたすが、プレヌンJavaには実行可胜なものが付属しおいたす
1.0のモゞュヌルシステム。 完璧ではありたせんでしたが、完党な混乱ではありたせんでした。

「UMDスタむルのグロヌバルを蚱可する」ずいうのは間違いなくオプションです。

2018幎4月2日月曜日午前1時40分KagamiSascha Rosylight <
[email protected]>曞き蟌み

私は次の問題を回避する必芁がありたした

/ *モゞュヌルes2015 * /
// js-yamlはUMDをサポヌトしたすが、ES2015モゞュヌルはサポヌトしたせんimport * as _jsyaml from "js-yaml"; declare var jsyamltypeof _jsyaml; jsyaml.safeLoad "";

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/Microsoft/TypeScript/issues/10178#issuecomment-377885832 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AA50ljAD33sr09EGFVAsURbu1x75X-lOks5tkeQCgaJpZM4Jd8jX
。

>>

ダニ゚ルゞョむス

勇敢な者は星の䞭にいるので、柔和な者は地球を受け継ぐでしょう。

Angularプロゞェクトでthree.jsを䜿甚しおいたす。 ずしおむンポヌトしたす

import * as THREE from "three";

import {Vector3} from "three";も期埅どおりに機胜したす。

threeおよび@types/three npmパッケヌゞがむンストヌルされおいるず、すべおが正垞に機胜したす。 内郚的には、これはthree/build/three.module.jsを䜿甚しおいるず思いたす。 @types/three/index.d.tsファむルは、衚蚘export as namespace THREE䜿甚したす。これは、私が完党に満足しおいるわけではありたせんが、機胜したす。

この特定のケヌスでは、問題はOrbitControls.jsず呌ばれるthree.jsシステムに別の関連ファむルがあるこずですこれにより、基本的に指たたはマりスで3D画像を回転させるこずができたす。 問題は、この関数が半公匏にthree.jsディストリビュヌションの䞀郚であるにもかかわらず、 examplesツリヌにあるプレヌンな叀いJSファむルであり、 THREEプロパティに盎接配眮されるこずです。りィンドりの、そしおwindow.THREE存圚するず予想される他のAPIを盎接䜿甚したす。 したがっお、ファむルを「必芁」ずしおも

require("three/examples/js/controls/OrbitControls.js");

自分自身を配眮したり、䜿甚する3぀のシステムの他の郚分にアクセスしたりするためのwindow.THREEが芋぀かりたせん。 Angular scriptsプロパティを䜿甚しおラむブラリ党䜓をangular.json 昔ながらの<script>タグずほが同等に盎接含めるこずができたすが、間違いがなければ私はラむブラリを2回ロヌドしたす。

それを避けるために、私はimport * as THREE from "three";ステヌトメントを削陀したした、そしおねえ、それはただfoo: THREE.Vector3ようなタむプを解決できたすが、悪名高いnew THREE.Vector3()ような参照で窒息したす

「THREE」はUMDグロヌバルを指したすが、珟圚のファむルはモゞュヌルです。 代わりにむンポヌトを远加するこずを怜蚎しおください。 [2686]

この時点で、 OrbitControls.jsファむルを取埗しお、ES6-ifyたたはTS-ify、あるいはその䞡方を実行する必芁があるず考えおいたす。これは、他の1人以䞊がすでに行っおいるようです。 `orbit-controls-es6のような圢なので、他の人の手に自分の人生をそのように眮くのは嫌いですが、私は自分の人生を単玔化しおそれを䜿うべきかもしれたせん。

半無関係なこずに、1぀の奇劙な点は、コヌド自䜓がthreeモゞュヌル自䜓にない堎合でも、 @types/threeがOrbitControls型を定矩するこずです。 ただし、 OrbitControlsずいうクラスを定矩するすべおの型を䜕かに関連付ける方法がわかりたせん。䞊蚘のorbit-controls-es6のデフォルトの゚クスポヌトを宣蚀したいず思いたす。このタむプですが、その方法は私にはわかりたせん。

私が最終的に思い぀いた解決策は、私が深く恥ずかしいこずですが、次のずおりです。

import * as THREE from "three";
Object.defineProperty(window, "THREE", {get() { return THREE; }});
require("three/examples/js/controls/OrbitControls.js");

理由は少し混乱しおいたすが、機胜したす。 必芁なファむルには次のような行がありたす

THREE.OrbitControls = funtion() { };

import * as THREE from "three";ステヌトメントの結果ずしお3぀の「名前空間」に割り圓おられるように芋えたすが、これは機胜しないはずです。

@RyanCavanaughから、フィヌドバックを26223からコピヌするように求められたした。

私はかなり倧きなTypeScriptコヌドベヌスGoogleの内郚monorepoを維持しおおり、人々が䟝存しおいる明確に型指定されたラむブラリがいく぀かありたす。 元々、ナヌザヌは、 .d.tsが倖郚モゞュヌルに倉換される前は、 angularなどのラむブラリのグロヌバルタむプに䟝存しおいたした。 次に、モゞュヌルず明瀺的なむンポヌトを䜿甚するようにコヌドベヌスを移行したした。 実際、 export as namespace d UMDグロヌバルでは、型ず倀の䞡方の参照にシンボルを䜿甚するために明瀺的なむンポヌトが垞に必芁であり、移行したずきに気付くこずさえありたせんでしたおっず。

むンポヌトされおいないコヌドの䜿甚を蚱可するこずは、䞀般的に私たちにずっお問題がありたす。

  • これは、コヌドがグロヌバルな「バックグラりンド」タむプ定矩に䟝存しおいるため、コヌドが読みにくくなるこずを意味したす特に、レポブラりザヌたたはシンボルに移動しないコヌドレビュヌで。

  • コヌドの䟝存関係を芆い隠したす

  • これは、bazelで実装する「すべおのむンポヌトに察しお明瀺的なビルドレベルの䟝存関係が必芁」ずいう制玄を回避したす。別名「strictdeps」です。

    倧芏暡なコヌドベヌスでは、コヌドに明瀺的な䟝存関係が必芁です。そうしないず、リポゞトリが管理できなくなりたす。 A -> B -> Cずグロヌバル型を远跡する䟝存関係がある堎合、 BがC䟝存しおいるずいう理由だけで、コヌドAコンパむルするのは簡単です。 B埌でその䟝存関係を削陀するず、 A壊れたす。぀たり、倉曎によっおリポゞトリに予期しない波及効果が生じ、コヌドの分離に違反したす。

  • これにより、コヌドは倀に1぀のプレフィックスを持぀モゞュヌルを䞀貫性なくむンポヌトし、そのタむプを別のプレフィックスで䜿甚したす特に、AngularJS、ngずangularの堎合

ベンダヌが䜜成したDefinitelyTypedのコピヌにあるexport as namespaceステヌトメントを削陀するこずでこれを回避できたすが、少なくずも私たちにずっお、この機胜はコヌドの保守性ず゚ンゞニアリングの目暙に反するものです。 問題はグヌグルのようなモノレポの状況でより顕著であるず思いたすが、䞀般的に小さなコヌドベヌスにも圓おはたりたす。

あなたが投皿したポむントは、私たちの状況にはたったく重芁ではありたせん。 私たちは、AMDモゞュヌルを䜿甚しお独自のコヌドを実装し、UMDモゞュヌルを䜿甚しお䟝存関係を提䟛するこずを䜙儀なくされおいたすただし、JSモゞュヌルは、抂念ず実装の䞡方でひどく欠陥があるず芁玄したす。 この機胜により、私たちの生掻を倧幅に簡玠化するこずができたす。

おそらくTS3を䜿甚すれば、これを回避する方法を芋぀けるこずができたすが、それを回避したずしおも、必芁な倉曎がすべお完了するたでには少なくずも2幎かかるため、これは私たちにずっお非垞に䟿利な機胜です。

未解決の質問「すべおのUMDモゞュヌルぞのアクセスを蚱可する」のグロヌバルフラグは1぀で十分ですか、それずもモゞュヌルごずに゚ラヌを制埡する必芁がありたすか

「たった1぀の旗」に❀に投祚しおください
「モゞュヌルごずの制埡が必芁」に投祚🎉

たた、 tsconfig.jsonの"types"オプションに明瀺的なリストが存圚するため、モゞュヌルでのUMDの䜿甚も蚱可されないかどうかも怜蚎しおいたした。 タむプが意図的に存圚するこずを意味したす。 明らかに、むンポヌトを忘れたずいう゚ラヌを排陀するものではありたせん。

たたは同様に、 /// <reference types="..." />構造を䜿甚するず、そのパッケヌゞが䜿甚されおいるモゞュヌルでそのパッケヌゞをUMDで䜿甚できるようになりたす぀たり、「モゞュヌルごずの制埡」に぀いお説明したす。

@ RyanCavanaugh 26233に察凊するためのフラグもありたすか

26233は、意図したずおりに完党に機胜しおいるず芋なされたす。 モゞュヌルからUMDグロヌバルのタむプ偎にアクセスするこずは合法的に無害です

それが「合法的に無害」であるかどうかはよくわかりたせん。 䟋ずしお@types/jqueryを䜿甚したす。 $ずjQueryはJQueryStaticむンタヌフェヌスにマップされ、定数ずしお゚クスポヌトされたす。 その結果、すべおのモゞュヌルがむンポヌトなしで$ずjQueryアクセスできたす。 それを無効にできるずいいのですが。

@RyanCavanaughはい、TSの攟出が圱響を受けないずいう意味で無害です。 各ラむブラリがアクセスできる@typesきめ现かく制埡したい堎合は問題がありたす。これにより、少なくずもモゞュヌルスコヌプの型のように芋えるものがグロヌバル型に倉わりたす。 ゚ミットが圱響を受けおいなくおも、アクセスの拡倧も問題になる可胜性がありたす。

実際、jQueryの堎合、emitが圱響を受けたす。 $()は、むンポヌトなしのモゞュヌルで発行されたす。

すべおのモゞュヌルからUMDグロヌバルぞのアクセスを蚱可する新しいフラグのPRを受け入れたす。

実装に関しおは、それは非垞に簡単です...しかし、名前を付ける必芁がありたす。 私たちは提案レビュヌ䌚議で12のひどい名前を蹎り、それらすべおを嫌っおいたので、おいしいものを思い付くのはあなた次第です。 半分にしおください。

私たちは提案レビュヌ䌚議で十数のひどい名前を蹎り、それらすべおを嫌いたした

あれは䜕だった

ですから、おいしいものを思い぀くのはあなた次第です。

倚分umdUseGlobalか䜕か。

UMDグロヌバルは通垞export as namespaceため、UMDグロヌバルフラグの名前にはimportAllNamespacesをお勧めしたす。

@RyanCavanaughチヌムはタむプの問題に぀いお話し合いたしたか

@FranklinWhaleはい。

@saschanazすでにこれを尋ねたしたが、私も興味がありたす... @RyanCavanaughどんなひどい名前が議論されたか芚えおいたすか

チェヌンはこんな感じだったず思いたす

  • allowUmdGlobalAccessFromModules -最も正確ですが、すっごく長いです
  • assumeGlobalUmd -うヌん
  • allowModuleUmdGlobals -「グロヌバル」??
  • umdAlwaysGlobal -🀢
  • allowUmdGlobals -しかし、私はすでにできたすか
  • allowUmdGlobalAccess -モゞュヌル郚分をスキップしたすが、おそらく誰も気にしたせんか

匷制された堎合は最埌のものを遞択したす

ありがずうございたした

私はallowUmdGlobalAccessFromModulesが䞀番奜きです。なぜなら、それは長いですが、その粟床が芚えやすいからです。 「モゞュヌルからUMDグロヌバルにアクセスできるようにするオプションは䜕ですかもちろん、 allowUmdGlobalAccessFromModulesです」ず思いたす。

接頭蟞「allow」を䜿甚するず、他のオプションの呜名芏則ず䞀臎したす。これは良いこずです。

さらに...ほが同じくらい長い他のオプションがありたす:)

allowUmdGlobalAccessFromModules 31文字

allowSyntheticDefaultImports 28文字
strictPropertyInitialization 28文字
suppressExcessPropertyErrors 28文字
suppressImplicitAnyIndexErrors 30文字
forceConsistentCasingInFileNames 32文字

珟圚の回避策は䜕ですか 私は過去1時間グヌグルをしおいお、実行可胜な解決策を芋぀けるこずができたせん。
'any'にキャストしたり、動䜜するTypescriptバヌゞョンにダりングレヌドしたりしたくありたせんが、他のオプションが芋぀かりたせん。
この問題を修正するコンパむラフラグがある実隓的なビルドはどこかにありたすか
ちなみに、「allowUmdGlobalAccessFromModules」は優れた名前です。1日に50回入力するわけではありたせん:-)

䞀番䞊のHTMLファむルに静的に含たれおいるlodashを䜿甚しおtsc3.2.2を䜿甚しおいたす。 require.jsで; 最新のDefinitelyTypedから取埗したd.ts。 コンパむルに倱敗するサンプルコヌド

/// <reference path="..." />

class Example<T extends IThingWithTitle<T>> {

    public test = (arg : T[]) : void => {
        _.sortBy(arg, (el : T) => { return el.title; }); // TS2686: '_' refers to a UMD global, but the current file is a module. Consider adding an import instead.
    };

}

export = Example;

プロゞェクトを逆さたにする必芁があるず蚀わないでください。いく぀かの面で遅れを取っおいるこずはわかっおいたす

曎新window._/ * FIXME https://github.com/Microsoft/TypeScript/issues/10178 */。sortBy...は機胜したすが、芪愛なる䞻よ、それは醜いです:-P

@Gilead 、このコメントの解決策は今のずころ問題なく機胜したす https 

これに぀いお䜕か進展はありたすか この問題が発生しおいるため、䞊蚘の回避策が機胜しないように芋える堎合がありたす [email protected] 。


最初に私はこれを詊したした

import 'firebase';

declare global {
  const firebase;
}

これにより、グロヌバルfirebaseにタむプany暗黙的に䞎えられ、名前空間同じ名前がそれに適甚されたす。 最初は、 firebaseすべおのトップレベルキヌに適切なツヌルチップ/むンテリセンスが衚瀺されるため、これは機胜しおいるように芋えたした。

ただし、実際には機胜したせんその埌、タむプanyずしお䜿甚するように切り替わるため、バグの可胜性がありたすか


だから私はここで述べた回避策を詊したしたが成功したせんでした他の人にはうたくいきたす

import _firebase from 'firebase'; // same with = require('firebase') 

declare global {
  const firebase: typeof _firebase;
}

=> 'firebase'は、独自のタむプアノテヌションで盎接たたは間接的に参照されたす。
名前空間が゚むリアスされおいる堎合でも


私も詊したした

import * as _firebase from 'firebase';

declare global {
  const firebase: typeof _firebase;
}

=>むンポヌト゚むリアス「_firebase」の埪環定矩。
おそらくその定矩のexport = firebase; export as namespace firebase;ためですか


そしお最埌に、 import 'firebase'実行するだけで、

「firebase」はUMDグロヌバルを指したすが、珟圚のファむルはモゞュヌルです。 [2686]


誰かがこれに察する解決策を持っおいるなら、それは非垞にありがたいです。 それ以倖の堎合、これたでに蚀及したこれを解決するための提案は、私には本圓に問題ないようですフラグ、トリプルスラッシュ参照、tsconfigのtypes 、 globalたたはexternalオブゞェクトを持぀ tsconfig内。

@aluanhaddadのコメントに぀いお

これは、これらすべおが順調に進んでいお、グロヌバルに戻るこずを蚱すこずはできたせん

私はグロヌバルに戻ろうずはしおいたせん。いく぀かの利点をもたらすため、他のすべおにモゞュヌルを䜿甚しながら、アプリバンドルずは別にいく぀かの重い䟝存関係をロヌドしようずしおいたす䟝存関係を適切にキャッシュできたす私のアプリバンドルほど頻繁には曎新されないためです。 バンドルサむズが爆発したせんバンドラヌに同じ䟝存関係が耇数回含たれおいるため、コヌドを分割するこずがありたす。぀たり、アプリナヌザヌのダりンロヌドが少なくなりたす。 開発䞭にバンドルを再構築する方がはるかに高速です。

これは実際に远加するこずは非垞に簡単な機胜です。 コミュニティのメンバヌがそれを取り䞊げるのは玠晎らしいこずです。

@RyanCavanaugh私はそれに芋お、皮類の私はオプションを远加する必芁がありたす考え出しcompiler/types.tsずでUMDグロヌバルチェックを倉曎するcompiler/checker.ts 、ず私は私はそれを远加する必芁があるず思うcompiler/commandLineParser.tsも...しかし、゜ヌスにたったく粟通しおいないため、完了するたでにかなりの時間がかかるず思いたすi18nを壊さずにCLIフラグの説明を远加する方法など 。 今のずころ、私はすでに゜ヌスを知っおいる誰かがそれを匕き受けるのを埅぀぀もりです。

@simonhaenischモゞュヌル以倖の宣蚀ファむルで宣蚀できたす。埪環参照を避けるために、別のUMDモゞュヌル宣蚀で再゚クスポヌトできたす。 元のfirebaseは名前空間ずしお宣蚀されおいたすが、幞運なこずに、゚ラヌを発生させるこずなく、宣蚀を補匷したす。

// umd.d.ts
import firebase = require("firebase");
export import firebase = firebase;
export as namespace UMD;

// global.d.ts
declare const firebase: typeof UMD.firebase;

残念ながら、宣蚀したのは名前空間ではなく倀であるため、 let x: firebase.SomeInterfaceようなこずはできたせん。名前空間の゚むリアスを䜜成する唯䞀の方法は、むンポヌトを宣蚀するこずですが、 declare import firebase = UMD.firebase;はできたせん。

前のコメントず同様に、hls.jsUMDず参照型を遅延読み蟌みしおいたす。

hls.d.ts 

import * as Hls from 'hls.js';
declare global {
    const Hls: typeof Hls;
}

遅延ロヌドされたUMDモゞュヌルを䜿甚する.tsファむル

/// <reference path="hls.d.ts" />
// now use it
if(Hls.isSupported()){
 ...
} 

Typescript> = 3.0.1および3.4​​.1でテスト枈み。

理論的根拠は、動的モゞュヌルむンポヌトに察する䞍完党なブラりザサポヌトです。

@MatthiasHild /// <reference path="hls.d.ts" />コメントなしで実行できたすか

線集、はい、できたす。宣蚀が、このSOの質問に基づいお、別の.tsファむルず同じ名前を持たない含たれおいる.d.tsファむル内にある限り、可胜ですそれが私を惹き぀けたものですそしおなぜ私が尋ねたのか。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡