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/
