node.js - Hvordan skriver du en node-modul ved å bruke TypeScript?


Så, det generelle svaret på det andre spørsmålet (Hvordan importerer man et modul ved bruk av TypeScript) er:

1) Opprett en blah.d.ts definisjonsfil.

2) Bruk:

/// <reference path="./defs/foo/foo.d.ts"/>
import foo = require("foo");

Kritisk, du trenger begge filene foo.d.ts og en foo.js et sted i dine node_modules for å laste; og navnet foo må nøyaktig samsvare for begge. Nå...

Spørsmålet jeg gjerne vil få besvart er hvordan du skriver en TypeScript-modul som du kan importere på den måten?

La oss si at jeg har en modul som dette:

- xq/
- xq/defs/Q.d.ts
- xq/index.ts
- xq/base.ts
- xq/thing.ts

Jeg vil eksportere modulen 'xq' med klassene 'Base' fra base.ts, og 'Thing' fra thing.ts.

Hvis dette var en node-modul i JavaScript, ville min index.ts sett omtrent slik ut:

var base = require('./base');
var thing = require('./thing');
module.exports = {
  Base: base.Base,
  Thing: thing.Thing
};

La oss prøve å bruke en lignende TypeScript-fil:

import base = require('./base');
export module xq {
    export var base = base.Base;
}

Påkall det:

tsc base.ts index.ts things.ts ... --sourcemap --declaration --target ES3 
                                   --module commonjs --outDir dist/xq

Hva skjer? Vel, vi får vår base.d.ts:

export declare class Base<T> {
  ...
}

og den spennende unyttige index.d.ts:

export declare module xq {
    var Base: any; // No type hinting! Great. :(
}

og helt ugyldig JavaScript som ikke engang importerer modulen:

(function (xq) {
    xq.base = xq.base.Base;
})(exports.xq || (exports.xq = {}));
var xq = exports.xq;

Jeg har prøvd en haug med variasjoner på temaet, og det eneste jeg får til å fungere er:

declare var require;
var base = require('./base');
export module xq {
    export var base = base.Base;
}

...men det ødelegger åpenbart helt typetjekkeren.

Så.

Typescript er flott, men dette modulgreiene suger helt.

1) Er det mulig å gjøre med den innebygde definisjonsgeneratoren (jeg er skeptisk)

2) Hvordan gjør man det for hånd? Jeg har sett import-setninger i .d.ts-filer, som jeg antar betyr at noen har funnet ut hvordan man gjør dette; hvordan fungerer de? Hvordan skriver du TypeScript for en modul som har en deklarasjon med en import-setning i seg?

(f.eks. Jeg mistenker at den riktige måten å gjøre en moduldeklarasjon på er:

/// <reference path="base.d.ts" />
declare module "xq" {
  import base = require('./base'); 
  module xq {
    // Some how export the symbol base.Base as Base here
  }
  export = xq;
}

...men jeg har ingen idé om hva typescripten som følger med det ville være).

Svar #1

For JavaScript :

var base = require('./base');
var thing = require('./thing');
module.exports = {
  Base: base.Base,
  Thing: thing.Thing
};

TypeScript :

import base = require('./base');
import thing = require('./thing');
var toExport = {
  Base: base.Base,
  Thing: thing.Thing
};
export = toExport;

Eller til og med denne typescripten:

import base = require('./base');
import thing = require('./thing');
export var Base = base.Base;
export var Thing = thing.Thin;

Svar #2

Typescript har virkelig forbedret seg siden dette spørsmålet ble stilt. I nyere versjoner av Typescript har språket blitt en mye strengere superset av Javascript.

Den riktige måten å importere/eksportere moduler på er nå den nye ES6-modulsyntaksen:

myLib.ts

export function myFunc() {
  return 'test'
}

package.json

{
  "name": "myLib",
  "main": "myLib.js",
  "typings": "myLib.d.ts"
}

Avhengige kan deretter importere modulen din ved å bruke den nye ES6-syntaksen:

dependent.ts

import { myFunc } from 'myLib'

console.log(myFunc())
// => 'test'

For et komplett eksempel på en node-modul skrevet i Typescript, vennligst sjekk ut denne malens kjerne:

https://github.com/bitjson/typescript-starter/

Relaterte artikler