Typescript-deklaration från delat bibliotek som använder requirejs


Jag försöker skriva ett TypeScript-bibliotek som delas mellan några andra TypeScript-applikationer. För att göra detta lade jag varje bibliotek som sin egen node-modul och har biblioteket inställt på att generera dess deklarationsfil.

För att testa har jag den delade biblioteket uppsatt med en fil:

lib\guid.ts

export class Guid {
    static EmptyGuid(): string {
        return '00000000-0000-0000-0000-000000000000';
    }
}

lib\tsconfig.json

{
  "compilerOptions": {
    "noImplicitAny": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,

    "module": "amd",
    "noEmitOnError": true,
    "removeComments": false,

    "target": "es5",
    "sourceMap": true,
    "declaration": true,

    "outFile": "./lib/lib-b.js"
  },
  "exclude": [
    "node_modules",
    "!node_modules/@types",
    "lib"
  ]
}

Jag får slutligen en deklarationsfil som ser ut så här:

lib\lib-b.d.ts

declare module "guid" {
    export class Guid {
        static EmptyGuid(): string;
    }
}

Och slutligen ställde jag in nodmodulen för att inkludera typningsinformationen:

lib\package.json

{
  "name": "lib-b",
  "version": "1.0.0",
  "description": "",
  "main": "./lib/lib-b.js",
  "typings": "./lib/lib-b.d.ts",
  "files": [
    "lib"
  ], 
  "author": "",
  "license": "ISC"
}

Nu i appen som använder biblioteket tar jag in det med npm:

app\package.json

{
  "name": "web-app",
  "version": "1.0.0",
  "description": "",
  "main": "./lib/index.html",  
  "author": "",
  "license": "ISC",
  "dependencies": {
    "lib-b": "file:../LibB"
  }
}

Och i en av dess filer försöker jag använda biblioteket på detta sätt:

import { Guid } from 'lib-b';

Men det ger mig följande fel:

error TS2306: File '.../WebApp/node_modules/lib-b/lib/lib-b.d.ts' is not a module.

Jag har letat runt, men de flesta exempel jag hittar handlar om att skriva typings för ett redan existerande JS-bibliotek - jag kan inte hitta mycket som handlar om att använda deklarationsfilen från befintlig TypeScript-kod. Ska deklarationsfilen vara användbar i andra appar? Finns det ett annat sätt att bygga återanvändbara TypeScript-bibliotek?

Svar #1

Jag får slutligen en deklarationsfil som ser ut så här:

Rekommendera att använda commonjs och följ npm node_modules-mönstret. Du kommer att få en fil som:

export class Guid {
    static EmptyGuid(): string;
}

Mer

Här är en snabbstartsvideo https://egghead.io/lessons/typescript-create-high-quality-npm-packages-using-typescript