typescript의 module.exports


84

누군가 module.exports를 수행하는 방법을 알고 있습니까?

나는 몇 가지 다른 방법을 시도하여

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();

Typescript로 가능합니까?

답변:


77

다음과 같이 TypeScript에서 단일 클래스를 내보낼 수 있습니다.

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입니다 (TypeScript v2.0.3을 사용하고 있습니다).

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

감사합니다! 왜 typescript가 export Person을 구현하지 않았는지 궁금합니다 ... bla bla bla? 논리적이라고 생각합니다. 아니면 뭔가 빠졌나요?
Arsen Mkrtchyan

1
파일에서 일부 타이핑을 내보낼 수도 있습니까? 테스트를 작성하기 위해 파일에서 타이핑을 얻고 싶을 수도 있지만 여전히 module.exports마지막 에는 a 가 필요합니다.
Eric Burel

21

이것은 이제 구현되었으며 TypeScript 0.9에서 준비되었습니다. :)


10
설명을 위해 (이것을 자세히 조사해야했기 때문에) 0.9의 구문은 blogs.msdn.com/b/typescript/archive/2013/06/18/…("Export = "아래)에서 사용할 수 있습니다 .
Dan

3
그리고 더 명확한 설명을 위해, 미래의 독자를 위해 요청자가 원하는대로 정확히 거의 구현되었습니다 . . . 하지만 제가 정말 원하는 것은 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);
Gurjeet 싱

10

그래서 해결 방법을 찾은 것 같습니다. .ts 파일의 괄호 안에 키워드 '모듈'을 감싸십시오.

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

생성 된 자바 스크립트 파일은 정확히 동일합니다.

(module).exports = MyClass;

var 모듈을 직접 선언하는 것보다 node.d.ts 정의 파일을 다운로드 하여 typescript 파일과 동일한 디렉토리에 보관하십시오. 다음은 node.d.ts가 동일한 디렉토리에 있다고 가정하는 익스프레스 node.js 라우팅 파일의 전체 샘플입니다.

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

그런 다음 SheetController를 새로 만들고 (express를 사용하여) view 메서드를 할당 할 수 있습니다.

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
불행히도 TypeScript 컴파일러는 이것을 잘 처리하지 못하는 것 같습니다. 예를 들어이 작업을 수행 할 때 클래스에서 파생 될 수 없습니다.
dcstraw

어떻게 작동할까요? CommonJs 대 AMD의 전체 논쟁이 아닙니다. 그 Common은 exports 변수로 직접 물건을 반환하는 것을 지원하지 않습니까?
George Mauer 2012
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.