[typescript] typescript의 module.exports

누군가 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로 가능합니까?



답변

다음과 같이 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 0.9에서 준비되었습니다. 🙂


답변

그래서 해결 방법을 찾은 것 같습니다. .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;


답변

추악하고 엉망이지만 여전히 할 수 있습니다.

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

다음으로 컴파일됩니다.

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


답변