module.exports trong typecript


84

có ai biết cách làm một module.exports không?

Tôi đã thử một số cách khác nhau kết thúc bằng

export class Greeter {}

sẽ biên dịch thành

exports.Greeter = Greeter;

Nhưng điều tôi thực sự muốn là:

exports = Greeter;

Để tôi có thể sử dụng nó như thế này:

import { Greeter } from "greeter";

const greeter = new Greeter();

và không

import { Greeter } from "greeter";

const greeter = new Greeter.Greeter();

Điều này có thể thực hiện được với Typecript không?

Câu trả lời:


77

Bạn có thể xuất một lớp duy nhất trong TypeScript như sau:

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;

Và đây là cách nó sẽ được sử dụng:

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

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

console.log(name); // Homer Simpson

Để hoàn chỉnh, đây là tsconfig.json của tôi (tôi đang sử dụng TypeScript v2.0.3):

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

Cảm ơn rất nhiều! Tôi tự hỏi tại sao bản ghi không thực hiện xuất khẩu Người ... bla bla bla? Tôi nghĩ rằng nó sẽ là hợp lý, không? hoặc tôi đang thiếu một cái gì đó?
Arsen Mkrtchyan

1
Có thể vẫn xuất một số kiểu đánh máy từ tệp không? Bạn có thể muốn lấy các bản đánh máy từ tệp để viết các bài kiểm tra, nhưng module.exportscuối cùng vẫn muốn có .
Eric Burel

21

Điều này hiện đã được triển khai và sẵn sàng trong TypeScript 0.9 :)


10
Để làm rõ (vì tôi phải đi tìm hiểu điều này), cú pháp trong 0.9 có sẵn ở đây: blog.msdn.com/b/typescript/archive/2013/06/18/… (trong "Export =").
Dan

3
Và để làm rõ hơn, cho bạn đọc tương lai, nó đã được thực hiện ALMOST chính xác như người hỏi mong muốn. . . Nhưng những gì tôi thực sự muốn là export = Greeter; , đó chính xác là những gì bạn làm :)
Binary Worrier

1
Tôi chỉ muốn hiển thị một đối tượng cấu hình từ config/db.tsvà sử dụng cấu hình đó trong ứng dụng. Đây là những gì tôi có thể làm thành công trong nguyên cảo 1.4: Trong config/db.tsghivar config = {connStr:'postgres://user:pass@host/dbname'}; export = config;app.tstham khảo nó nhưimport dbConfig = require('./config/db'); dbConnect(dbConfig.connStr);
Gurjeet Singh

10

Vì vậy, tôi nghĩ rằng tôi đã tìm thấy một giải pháp. Chỉ cần đặt từ khóa 'mô-đun' trong dấu ngoặc đơn trong tệp .ts của bạn:

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

Tệp javascript được tạo sẽ giống hệt nhau:

(module).exports = MyClass;

Lưu ý, tốt hơn là tự khai báo mô-đun var, hãy tải xuống tệp định nghĩa node.d.ts và gắn nó vào cùng thư mục với tệp typecript của bạn. Đây là mẫu hoàn chỉnh của tệp định tuyến express node.js giả sử node.d.ts nằm trong cùng một thư mục:

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

Sau đó, tôi có thể tạo mới một SheetController và (sử dụng express) gán phương thức xem:

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

Tôi cho rằng có thể thoát bất kỳ từ khóa nào bằng cách sử dụng mẫu này:

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

2

Nó xấu xí và hacky, nhưng bạn vẫn có thể làm:

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

Mà biên dịch thành:

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

1
Thật không may, trình biên dịch TypeScript dường như không xử lý tốt điều này. Ví dụ, bạn không thể lấy từ lớp khi bạn làm điều này.
dcstraw

nó sẽ hoạt động như thế nào? Đó không phải là toàn bộ tranh luận giữa CommonJs và AMD. Đó là Common không hỗ trợ trả lại nội dung trực tiếp như biến xuất khẩu?
George Mauer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.