Esporta e pubblica tutti i tipi e le interfacce in Typescript

Oct 17 2020

Sto cercando di pubblicare una libreria di dattiloscritti. Non mi è chiaro come esporre tutti i tipi e le interfacce. Ecco la mia configurazione:

mylib
  ├──src
  │  ├──types
  |  |  └──mytypes.ts
  │  └──index.ts
  ├──package.json
  └──tsconfig.json
//index.ts

import {MyInterface} from './types/mytypes.ts';

const my_main_name = {
  myfunc: function(param1:MyInterface):void{
    console.log(param1.a);
  }
}

//mytypes.ts

export interface MyInterface {
  a:string
}

Sto generando file di dichiarazione impostando tsconfig.jsonparam "declaration":"true".

Ora voglio usare queste librerie come dipendenza di un'altra.

mylib
yrlib
  ├──src
  │  └──index.ts
  ├──package.json
  └──tsconfig.json
//yrlib/package.json
{
 ...
 "dependencies":{
    "mylib":"file:../mylib/"
  }
}

//yrlib/src/index.ts

import * as mylib from 'mylib';

let a:mylib.MyInterface = ...
      // ~~ Namespace has no export member for MyInterface

Ottengo il completamento automatico per mylibperché viene esportato.

La mia domanda è come posso vedere tutti i tipi e le interfacce del mylibmodulo all'interno yrlib?

Dal momento che possono essere centinaia e in tutti i diversi file e cartelle.

Devo esportarli tutti uno per uno? Qual è la migliore pratica? C'è un modo per esportare tutti i tipi contemporaneamente?

E come "typying":"dist/index.d.ts"in package.jsonsi inserisce in tutto questo? Dovrebbero essere tutti i tipi in un file? Perché Typescript non genera questo file?

Dovrei usare uno spazio dei nomi che contenga tutto? Non riesco a trovare una spiegazione completa su questo argomento.

Risposte

2 nbl7 Oct 18 2020 at 14:36

Recentemente ho affrontato lo stesso problema e l'unico modo che ho trovato per pubblicare il tuo codice Type-Space (es: tipi, interfacce) insieme al tuo codice Value-Space (es: funzione, classi, variabili) è esportare un namespaceche contiene qualunque cosa.

Un'altra cosa strana è che per esportare in namespacequalcosa di importato, la sintassi è:

import * as mymod from './mymod';
import * as mytypes from './mytypes';

export namespace mylib {
  export import mod = mymod;
  export import types = mytypes;
}

Con la export importsintassi.

Sfortunatamente questo nel mio eslinter si risolverà in un avviso / errore poiché apparentemente legge mode typescome unused-vars.

Non capisco perché non c'è una spiegazione completa per questo argomento nella documentazione.