टाइपस्क्रिप्ट में मॉड्यूल


85

किसी को पता है कि कैसे एक मॉड्यूल करना है।

मैंने कुछ अलग तरीकों को आजमाया

export class Greeter {}

जो संकलन करेगा

exports.Greeter = Greeter;

लेकिन मैं वास्तव में क्या चाहता हूं:

exports = Greeter;

ताकि मैं इसे इस तरह उपयोग कर सकूं:

import { Greeter } from "greeter";

const greeter = new Greeter();

और नहीं

import { Greeter } from "greeter";

const greeter = new Greeter.Greeter();

क्या टाइपस्क्रिप्ट के साथ यह संभव है?

जवाबों:


78

आप इस तरह टाइपस्क्रिप्ट में एक एकल वर्ग निर्यात कर सकते हैं:

class Person {

  private firstName: string;
  private lastName: string;

  constructor(firstName: string, lastName: string) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  public getFullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

export = Person;

और यहां बताया गया है कि इसका उपयोग कैसे किया जाएगा:

var Person = require('./dist/commonjs/Person.js');

var homer = new Person('Homer', 'Simpson');
var name = homer.getFullName();

console.log(name); // Homer Simpson

पूरा होने के लिए, यहाँ मेरा tsconfig.json है (मैं टाइपस्क्रिप्ट v2.0.3 का उपयोग कर रहा हूँ)

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist/commonjs",
    "rootDir": "src/ts",
    "target": "es5"
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}

आपका बहुत बहुत धन्यवाद! मुझे आश्चर्य है कि टाइपस्क्रिप्ट ने निर्यात व्यक्ति को लागू क्यों नहीं किया है ... bla bla bla? मुझे लगता है कि यह तर्कसंगत होगा, नहीं? या मुझे कुछ याद आ रहा है?
आर्सेन मकार्ट्यान

1
क्या अब भी फ़ाइल से कुछ टाइपिंग निर्यात करना संभव हो सकता है? आप परीक्षण लिखने के लिए फ़ाइल से टंकण प्राप्त करना चाह सकते हैं, लेकिन फिर भी module.exportsअंत में चाहते हैं ।
एरिक ब्यूरेल

21

यह अब लागू किया गया है और टाइपस्क्रिप्ट 0.9 में तैयार है :)


10
स्पष्टीकरण के लिए (चूंकि मुझे इसे खोदना था), 0.9 में वाक्यविन्यास यहां उपलब्ध है: blogs.msdn.com/b/typescript/archive/2013/06/18/… ("निर्यात =" के तहत)।
डेन

3
और भविष्य के स्पष्टीकरण के लिए, भविष्य के पाठकों के लिए, इसे ALMOST के रूप में लागू किया गया है, जैसा कि पूछने वाला वांछित है। । । लेकिन जो मैं वास्तव में चाहता हूं export = Greeter; , वही आप करते हैं :)
बाइनरी वॉरियर

1
मैं एक कॉन्फिग ऑब्जेक्ट को सिर्फ config/db.tsऐप से उस कॉन्फिगरेशन को एक्सपोज़ करना चाहता था । में: यह है कि मैं क्या टाइपप्रति 1.4 में सफलतापूर्वक कर सकता है config/db.tsलिखने var config = {connStr:'postgres://user:pass@host/dbname'}; export = config;और में app.tsके रूप में यह उल्लेखimport dbConfig = require('./config/db'); dbConnect(dbConfig.connStr);
गुरजीत सिंह

10

इसलिए मुझे लगता है कि मैंने एक वर्कअराउंड ढूंढ लिया है। बस अपनी .ts फ़ाइल में कोष्ठक में कीवर्ड 'मॉड्यूल' लपेटें:

declare var module: any;
(module).exports = MyClass;

उत्पन्न जावास्क्रिप्ट फ़ाइल बिल्कुल वैसी ही होगी:

(module).exports = MyClass;

ध्यान दें, अपने आप को var मॉड्यूल घोषित करने से बेहतर है, नोड . d.ts परिभाषा फ़ाइल डाउनलोड करें और इसे उसी प्रकार निर्देशिका में चिपकाएँ जैसे आपकी टाइपस्क्रिप्ट फ़ाइल। यहाँ एक एक्सप्रेस नोड.जेएस रूटिंग फ़ाइल का एक पूरा नमूना है जो नोड मान लेता है। एक ही निर्देशिका में है:

/// <reference path="node.d.ts" />
var SheetController = function () {
    this.view = function (req, res) {
        res.render('view-sheet');
    };
};
(module).exports = SheetController;

मैं फिर एक शीटकंट्रोलर को नया कर सकता हूं और (एक्सप्रेस का उपयोग करके) दृश्य विधि प्रदान करता हूं:

var sheetController = new SheetController();
app.get('/sheet/view', sheetController.view);

मुझे लगता है कि इस पैटर्न का उपयोग करके किसी भी कीवर्ड को बचाया जा सकता है:

declare var reservedkeyword: any;
(reservedkeyword).anything = something;

2

यह बदसूरत और हिकी है, लेकिन आप अभी भी कर सकते हैं:

class Greeter {}
declare var exports:any;
exports = Greeter;

जो इसमें संकलित है:

var Greeter = (function () {
    function Greeter() { }
    return Greeter;
})();
exports = Greeter;

1
दुर्भाग्य से टाइपस्क्रिप्ट कंपाइलर इसे अच्छी तरह से संभाल नहीं पाता है। उदाहरण के लिए जब आप ऐसा करते हैं तो आप कक्षा से नहीं निकल सकते।
dcstraw

यह कैसे काम करेगा? यह आम तर्क बनाम एएमजे बनाम एएमडी के साथ नहीं है। वह कॉमन सीधे निर्यात चर के रूप में सामान लौटाने का समर्थन नहीं करता है?
जॉर्ज माउर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.