4928


TypeScript で外部モジュールを使用しています。

あるモジュールの指定したクラスだけを使いたい場合にモジュール名を指定せずに済む方法はあるでしょうか。

具体例を挙げると、次のような形ではなく、

[code]

    // mymodule.ts
    export class Klass {}
    
    // index.ts
    import m = require('./mymodule');
    klass = new m.Klass();
    
[/code]

次のような形で使いたいのです。(これはイメージ)

[code]

    // mymodule.ts
    export class Klass {}
    
    // index.ts
    import Klass = require('./mymodule').Klass;
    klass = new Klass();
    
[/code]

単一のクラスしか使わないため、可能なら `m` のようにモジュール名を指定したくないのです。

可能でしょうか？また、どのように書けば良いのでしょうか？


CC BY-SA 3.0
2015-01-20T12:04:36.557
4910
2016-11-10T23:13:32.353
2341
question
typescript
TypeScript で単一のクラスを import する方法


> 単一のクラスしか使わないため、可能なら m のようにモジュール名を指定したくない

モジュールから単一のクラスしか`export`しない場合であれば、[`export
=`](http://www.typescriptlang.org/Handbook#modules-
export-)でクラスそのものを直接エクスポートすることで以下のように書けます。

[code]

    // mymodule.ts
    class Klass {}
    export = Klass;
    
    // index.ts
    import Klass = require('./mymodule');
    var klass = new Klass();
    
[/code]

> あるモジュールの指定したクラスだけを使いたい場合にモジュール名を指定せずに済む方法

複数のオブジェクトを`export`しているモジュールから、特定のものを直接`import`する、というのはできなさそうです。[言語仕様書](http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf)の"11.2.2
External Import Declarations"に構文定義があります:

[code]

    ExternalImportDeclaration:
        import Identifier = ExternalModuleReference ;
    ExternalModuleReference:
        require ( StringLiteral )
    
[/code]

これに従えば、`import identifier =
require('string');`という文しか受け付けてくれないので、`require()`の後に何かを付けるような余地がありません。

コードの先頭で1回だけモジュール名を指定してよい、というところまで妥協すれば、後で利用したいクラスをローカル変数に持つようにすることで、それ以降はモジュール名を気にしなくてよくなります:

[code]

    import m = require('./mymodule');
    import Klass = m.Klass; // var Klass = m.Klass; にコンパイルされる
    var klass = new Klass();
    
[/code]


CC BY-SA 3.0
2015-01-20T14:30:44.490
4928
2015-01-21T07:21:26.317
2015-01-21T07:21:26.317
30
30
4910
answer


ES Modules 前提の環境では次の記述で十分ですね。

[code]

    // mymodule.ts
    export class Klass {}
    
    // index.ts
    import { Klass } from './mymodule';
    klass = new Klass();
    
[/code]


CC BY-SA 3.0
2016-11-10T23:13:32.353
30310
2016-11-10T23:13:32.353
2341
4910
answer