Typescript: 匷制むンポヌト

䜜成日 2014幎09月04日  Â·  31コメント  Â·  ゜ヌス: microsoft/TypeScript

これを行うシナリオはたくさんありたす。

import myExternalModule = require("./myExternalModule");
// not using myExternalModule here

コヌドでmyExternalModuleを䜿甚しおいたせんが、requirejsを䜿甚しおコヌドを含めたいず思っおいたす。 私はそれがそこにある必芁がありたす。
forceimportキヌワヌドがあれば、ずおもかっこいいでしょう。

最も参考になるコメント

だからなぜ単に远加しないのですか

import * as React from "react"; // get the types
import "react";  // just for side effect

出力では、最埌のむンポヌト import "react"は省略されたせん。

党おのコメント31件

曞くこずで匷制的に攟出できるはずです

var myExternalModule = require("./myExternalModule");

ただし、「。/myExternalModule」が正しくないパスの堎合、これは文句を蚀いたせん。

正しいアプロヌチは、副䜜甚のないダミヌ参照を導入するこずです。

import myExternalModule = require("./myExternalModule"); 
myExternalModule;

これはハックですが、このかなり狭いナヌスケヌスに新しい構文が導入される可胜性はほずんどありたせん。 蚭蚈目暙を参照しおください

TypeScriptがvar myExternalModule = require("./myExternalModule");のパスを怜蚌する堎合、ナヌザヌはハックに頌るこずなく、 emit_および_getコンパむル時怜蚌を匷制できたす。

var 、

さらに、必芁に応じおamd-dependency属性を䜿甚できたす。

䜿われおいないものをどのような目的で茞入しおいたすか

たずえば、Angularアプリでは、他のファむルにいく぀かのディレクティブがありたす。 これらのディレクティブをむンポヌトする必芁がありたす。そうしないず、HTMLマヌクアップが機胜したせん。 ただし、JavaScriptでは䜿甚したせん。
通垞、Angularでは、ほずんどのモゞュヌルは分離されおおり、盞互に䟝存関係はありたせんが、アプリ党䜓を機胜させるにはむンポヌトする必芁がありたす。

+1
それは私を混乱させたす。
TypeScriptコンパむラがそれを排陀するのはなぜですか
倖郚モゞュヌルはむンスタンス化されおいないモゞュヌルではありたせん。
requireには副䜜甚がありたす。
import句は、AMDおよびCommonJSの芁件ず互換性があるようです。 そうではありたせん。

この問題は、require-ingモゞュヌルが実際には䜕も゚クスポヌトせず、代わりにes5-shim 、 es6-shimなどのグロヌバルオブゞェクトの機胜をシムする堎合にも厄介です。

それは私を混乱させたす。
TypeScriptコンパむラがそれを排陀するのはなぜですか

モゞュヌルからタむプ情報のみをむンポヌトしたい堎合があるため、これは最適化です。

import foo = require('foo');

function bar(paramOne: foo.ParamOne, paramTwo: foo.ParamTwo){}

それは単なる最適化ではありたせん。 むンポヌトされたモゞュヌルをタむプのみに䜿甚しおいる堎合぀たり、倀の䜍眮で䜿甚されおいない堎合、モゞュヌルは実行時に存圚しないアンビ゚ントタむプのみのモゞュヌルである可胜性があるため、requireロゞックを発行できたせん。 モゞュヌルむンポヌトを発行するず、存圚しないモゞュヌルを読み蟌もうずしたずきにランタむム゚ラヌが発生したす。

これにはamd-dependencyフラグを䜿甚できたす。

/// <amd-dependency path="foo" />

import x = require('foo');

ちょっずしたハックのように芋える<amd-dependency>代わりに、 <reference name="..."> IMOを䜿甚するの

@danquirk TypeScript゚ンゞンにむンポヌトステヌトメントの最適化の責任を負わせるこずは、恣意的で危険なこずです。 TypeScriptがJavaScriptからただキャプチャしおいないパタヌンはたくさんありたす。 1぀の䟋は、 thisがタむプ229を持぀可胜性があるこずに察凊しない方法です。

むンポヌトは、珟圚のコヌドがロヌドされる前に䟝存関係をロヌドするために䜿甚され、盎接参照するこずはできたせん。 角床の䟝存関係は1぀の䟋ですが、jQueryプラグむンは別の䟋です。 ベヌスオブゞェクトを拡匵し、盎接参照されないラむブラリは、「機胜」の圱響を受けたす。 ロヌカル静的分析に基づいおむンポヌトを任意に含めないこずを決定するこずにより、むンポヌトステヌトメントを䜜成した開発者の明瀺的な意図にCスタむルのコンパむラパタヌンを課すこずになりたす。 importの蚘述には、䟝存関係ずしお含たれ、モゞュヌルのロヌカルスコヌプで䜿甚できるこずが期埅されたす。 その他のアクションは、モゞュヌル内にimportを曞き蟌むこずを遞択するずいう自然な期埅に察する副䜜甚です。

この堎合、TypeScriptコンパむラヌはより少ないこずを行い、より倚くのこずを達成できる可胜性が非垞に高いです。

TypeScriptの次のリリヌスでは、ES6スタむルのモゞュヌルがサポヌトされたす倉曎は珟圚マスタヌにありたす。 したがっお、䟝存関係を宣蚀するだけでよい堎合は、次を䜿甚できたす。

import "myLib";

コンパむラはこのむンポヌトを削陀したせん。

既存の䞀貫性のない行動に察凊するのでしょうか、それずも人々が発芋するのが楜しいものずしお残るのでしょうか importがファむルを䟝存関係ずしお远加しない堎合であるこずをドキュメントに远加する必芁がありたすか TypeScript AMDモゞュヌルをビルドするずき、 ///<reference...ぱラヌず芋なされたすか

import珟圚機胜する方法は、悪い蚭蚈です。 悪いデザむンは曖昧さを生み出したす。 远加の動䜜が明確に定矩されおいない堎合、それは副䜜甚ですが、発芋される可胜性が高くなりたす。 したがっお、このフォヌラムでは、OP、私、およびそれに関連するその他のコメントずバグがありたす。

CommonたたはRequireスタむルの䟝存関係管理を䜿甚する堎合にすでに存圚する既存の䞀連のプラクティスがありたす。 importの実装は、それが無芖されたこずを瀺しおいたす。

ドキュメントに぀いおは、仕様のセクション11.2.5およびセクション11.2.6を参照しおください。

倖郚むンポヌト宣蚀は、生成されたJavaScriptで、モゞュヌルシステムホストによっお提䟛される「require」関数の呌び出しによっお初期化される倉数ずしお衚されたす。 むンポヌトされたモゞュヌル、たたはむンポヌトされたモゞュヌルを参照するロヌカル゚むリアスセクション10.3が、むンポヌトされたモゞュヌルの本䜓のどこかでPrimaryExpressionずしお参照されおいる堎合にのみ、特定のむンポヌトされたモゞュヌルに察しお倉数宣蚀ず「require」呌び出しが発行されたす。 むンポヌトされたモゞュヌルがModuleNameたたはTypeQueryExpressionずしおのみ参照されおいる堎合、䜕も出力されたせん_。

///参照はむンポヌトず同じではありたせん。 ///参照は、domAPIなどの远加の宣蚀をグロヌバルスコヌプにもたらしたす。 これは、これらの゚ンティティの存圚を信頌するためのコンパむラぞのステヌトメントであり、生成されたコヌドには圱響したせん。

䞀方、むンポヌトは、requireステヌトメントずしお発行する必芁がありたす。 型の䜍眮でむンポヌトのみを䜿甚しおいる堎合、意図は明確ではありたせん。型実行時に存圚しない蚭蚈時の構成芁玠のみが必芁であり、この堎合はむンポヌトを省略したす。 、そうでない堎合は、存圚しないタむプのみのモゞュヌルをむンポヌトする可胜性がありたす。 たたは、副䜜甚も必芁です。 埌者の堎合、 import "mod";構文は、意図を宣蚀するためのより明確な構文のようです。

@mhegazy新しい号を開きたくないのですが、これはReactの䞖界では少し問題です。
以䞋のコヌドを怜蚎しおください。jsにコンパむルするず、 React参照はコヌドに衚瀺されないため削陀され、 ReactRouterはそれに䟝存するため、コヌドは倱敗したす。 修正...本圓にばかげおいるのはコヌドの䞋です。 それを取り陀くより賢い方法はありたすか ありがずう。

import * as React from "react"; var temp = React.DOM;
....

// mf("route.schedules", "") // this is to register a translation
anonymousRoutes.route("/schedules", {
  name: "schedules",
  subscriptions: function() {
    this.register("schedules", subscriptions.subscribe("schedules"));
  },
  action: () => {
    ReactLayout.render(ClearLayout, {content: <Book />});
  }
});

修正;-EHM

import * as React from "react"; var temp = React.DOM;
...

ReactRouterがコヌドに䟝存しおいるため、コヌドは倱敗したす。

var "React"が必芁ですか、それずもむンポヌトによる副䜜甚が必芁ですか

むンポヌトによる副䜜甚が必芁です。 varは、トランスパむルされたコヌドのむンポヌトを削陀しないようにするために远加されたした。

だからなぜ単に远加しないのですか

import * as React from "react"; // get the types
import "react";  // just for side effect

出力では、最埌のむンポヌト import "react"は省略されたせん。

残念ながら、このダりは機胜せず、私はただ埗たす

ReferenceError: React is not defined
    at action [as _action] (schedule_router.jsx:15)
    at Route.callAction (kadira_flow-router.js?f961d732ed2b89a53d490af5979b899800aa1a5d:2306)
    at kadira_flow-router.js?f961d732ed2b89a53d490af5979b899800aa1a5d:2025
    at Object.Tracker.nonreactive (tracker.js:560)
    at kadira_flow-router.js?f961d732ed2b89a53d490af5979b899800aa1a5d:2016
    at Tracker.Computation._compute (tracker.js:294)
    at Tracker.Computation._recompute (tracker.js:313)
    at Object.Tracker._runFlush (tracker.js:452)
    at Object.Tracker.flush (tracker.js:412)
    at Router._invalidateTracker (kadira_flow-router.js?f961d732ed2b89a53d490af5979b899800aa1a5d:2065)

ここでの理由は、Meteorの「匱い䟝存関係」であり、必芁なすべおの参照を提䟛するために_callee_に䟝存しおいるず思いたす。

私は最近Angular2のtypescriptを孊び始めたした。これは、他の新芏参入者にも圓おはたるず確信しおいるので、䜕床も私を捕らえたした。 これは最適化であるこずを理解しおいたすが、実際には非垞に混乱しおいたす。 tsファむルに䜕かを入力するず、単に無芖するのではなく、生成、出力、たたは䜕らかの皮類のファむルが生成されるず予想されたす。 requireステヌトメントを匷制的に䜜成できるようになりたしたが、それは少しハッキヌなようです。 これは、ナヌザヌずしおの私が、コンパむラヌが䜕が最善かを決定するこずなく、自分で決定できるはずの原因のように思われたす。

TypeScriptは倀の䞊に型宣蚀をオヌバヌレむするため、同じむンポヌト構文で型、倀、たたはその䞡方を取埗できたす。 これにより、モゞュヌルの操䜜が非垞に䟿利で盎感的になりたす。 別のモゞュヌルから型が必芁な堎合は、倉数をむンポヌトするずきにそれをむンポヌトするか、クラスをむンポヌトしお、型ずしおもnewのコンストラクタヌずしおも䜿甚したす。

これの裏偎では、モゞュヌルは単なるタむプコンテナであるため、存圚しないモゞュヌルにむンポヌトするこずができたす。 コンパむラがこれらのモゞュヌルぞの参照を発行した堎合、実行時に倱敗したす。 私たちが実斜しおいる解決策は、むンポヌトがどのように䜿甚されたかを怜出するこずであり、むンポヌトぞのすべおの参照が型ずしお䜿甚されるため、実行時に䞍芁であり、省略されたす。

モゞュヌルの副䜜甚も必芁な堎合は、明らかにこれは混乱を招く可胜性がありたす。 しかし、逆に、存圚しないモゞュヌルぞのむンポヌトが発行された堎合も混乱を招きたす。同じ構文で型ず倀をバンドルするずいう利䟿性を倱う必芁がありたす。

回避策
埓来の解決策を䜿甚しおいる堎合 moduleResolutionがnode蚭定されおいない堎合、識別子に!を含むむンポヌトステヌトメントが回避されるこずはありたせん。 これは、 systemjs動䜜をより適切にサポヌトしようずしおいるこずず関係があるず思いたすが、むンポヌトを匷制するために䜿甚できたす。 systemjs、requirejs、たたはモゞュヌル識別子の再マッピングを可胜にするロヌダヌを䜿甚しおいる堎合は、匷制むンポヌトを!jsたたは同様のマヌクで終了し、モゞュヌルロヌダヌでマップするこずができたす。 TSはむンポヌトを逐語的に出力しタむプチェックや解決を詊みたせん、ロヌダヌにむンポヌトを理解する方法を教えるこずができたす。

チヌムは、checker.tsなど、これらのタむプのむンポヌト甚に特別なケヌスのコヌドを䜜成する必芁があるようです。

// If we're compiling under --jsx react, the symbol 'React' should
// be marked as 'used' so we don't incorrectly elide its import. And if there
// is no 'React' symbol in scope, we should issue an error.
if (compilerOptions.jsx === JsxEmit.React) {
    let reactSym = resolveName(node.tagName, "React", SymbolFlags.Value, Diagnostics.Cannot_find_name_0, "React");
    if (reactSym) {
        getSymbolLinks(reactSym).referenced = true;
    }
}

@mhegazyが指摘しおいるように、これは最適化だけではなく、ランタむム゚ラヌの原因ずなるランタむム定矩むンタヌフェむスなどのないむンポヌトを必芁ずしないようにするためです。

私はどちらがより頻繁に起こるのか疑問に思いたす。 むンポヌトが* .d.tsであるかどうかを簡単に怜出できるため、それらは簡単に削陀されたす。

残りの堎合、むンポヌトされたモゞュヌルにランタむム出力がなく、それらのむンポヌトを削陀するだけであるこずをコンパむラヌが怜出するのは非垞に簡単なこずのように思われたす。

DRYの芳点から、この提案は、あなたのトランスパむラヌがこの重耇したコヌドを私のために曞くためのトランスパむラヌがあればいいのにず思いたした。

import * as React from "react"; // get the types
import "react";  // just for side effect

私の芋方では、実行時にロヌドする必芁があるかどうかは、_imported_ファむルの遞択である必芁がありたす副䜜甚があるこずがわかっおいるため。 他のファむル/モゞュヌルの実装の詳现を知るこずはビゞネスではないため、これは実際には_loading_ファむル぀たり、importステヌトメントを含むファむルによっお決定されるべきではありたせん。

少なくずもこれは、ディレクティブずサヌビスを定矩するファむルが参照された堎合に実行時にロヌドする必芁があるこずを「認識」しおいるため、コンパむラヌがそれを削陀しおはならない、angularjsの芳点からはうたく機胜したす。 タむプスクリプトコンパむラぞのファむル内の「削陀しない」ためのある皮のヒントは、このIMOを修正したす。 しかし、私はおそらくここでいく぀かのナヌスケヌスを芋萜ずしおいたす。

-JM

xmodule.ts

console.log('ive been imported');
export class X {
}
import {X} from "xmodule"; // get the types
import "xmodule";  // just for side effect

xmoduleにステヌトメント䟋console.logステヌトメントがある堎合、それは定矩䞊、単なる宣蚀の山ではありたせん。 xmoduleが単なる䞀連の型宣蚀以䞊のものず芋なされるようにするために、xmoduleを䜿甚するステヌトメントを䜜成するこずはむンポヌトモゞュヌルの責任ではありたせん。

@weswigham

むンポヌトを匷制するために匷打を䜿甚するずおっしゃいたした。 それは私のシナリオに適しおいたす。 どうすれば䜿甚できたすか 次のすべおを詊したした

!import {Service} from './service';
import! {Service} from './service';
import {!Service} from './service';
import {Service!} from './service';
import {Service} from '!./service';
import {Service} from './service!';
import {Service} from !'./service';
import {Service} from './service'!;

文字列内にありたしたが、パスマッピングが導入されたずきに、この動䜜は最近削陀されたず思いたす。

私はノヌドラッパヌをむンポヌトするためにreactのようなラむブラリを䜿甚しおいたす-h私が間違っおいなければreactではreactです、それで私は次のようにむンポヌトしたす

import { h, Component } from "preact";

そしお、もちろん、実行時にhはありたせん。 なぜそこにいるのでしょうか たた、jsxpreserveず䞀緒に䜿甚するず、TypeScriptは実際にはhに぀いおは認識したせんが、babelはそれを認識したす。

したがっお、hのような参照を䜿甚しお、残っおいるもの。 むンポヌト埌、そうですか

h たたはその他のカスタムjsxファクトリの堎合は、 --jsxFactoryを䜿甚しお、これが実行時に䜿甚しおいるファクトリであるこずをコンパむラに通知したす。 䟋 --jsxFactory h 。

珟時点ではtypescript@nextは必芁ありたせんが、TypeScript2.1.2で利甚できるはずです。

@mhegazy 2皮類のJSXコンシュヌマヌreactずsnabbdomなどがあるプロゞェクトの堎合、これは受け入れられたせん。

私は、reactを䜿甚しおWeb UIをレンダリングし、カスタマむズされた仮想domを䜿甚しおwebglオブゞェクトをレンダリングするプロゞェクトに取り組んでいたす。 たた、同じプロゞェクトに2皮類の@jsxアノテヌションが必芁なため、問題が発生したす。

今、私は自分のhをグロヌバル倉数ずしお゚クスポヌトするこずを䜙儀なくされおいたす...それは醜いです。

これを行うワンラむナヌむンポヌトを必芁ずする/望んでいる開発者のリストに私を含めおください。 これを実珟するための2行の゜ヌスは、特に倚数のモゞュヌルを連続しおむンポヌトする堎合に、排陀しようずしおいるものです。 これたでのずころ、私にずっお最もよく聞こえたのは、むンポヌトを匷制するためのキヌワヌド/構文だず思いたす。 みんなありがずう

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