commonjs - Bygga ett Typescript-bibliotek med både standard- och namngivna exporteringar?


Jag gillar hur React kan importeras som ett standardobjekt som import React from 'react' och importeras på ett destrukturerat sätt, som import { useEffect } from 'react' eller till och med import * as Whatever from 'react' om man känner sig fräck. Jag försöker bygga mitt eget TypeScript-bibliotek för npm som kan importeras på alla dessa 3 sätt (utöver det vanliga require-syntakt, och jag har spenderat omkring 15 timmar på det hittills utan att kunna få det att fungera (frustrerande).

Just nu använder jag rollup för att bygga lib/cjs och lib/esm, för att stödja både CommonJS och Modules. Jag låter också typescript-kompilatorn (tsc) bygga typfiler och lägga dem i /lib/types.

Men det jag VERKLIGEN sitter fast på är hur jag ska exportera mina filer på samma sätt som React gör. Hittills använder jag en index.ts 'barrel-fil' i roten av mitt bibliotek, som är något i stil med:

export * från './filename1' export * från './filename2' ...

Men detta ger uppenbarligen inte en standardexport för mitt bibliotek. Finns det någon sorts index.d.ts-moduldeklarationsmagi jag behöver göra? Alla tips/tutorials om att bygga ett TypeScript-bibliotek skulle vara till hjälp. Jag har lyckats få både standardimporter och namngivna importer att fungera för mitt bibliotek, men inte båda samtidigt.

Svar #1

Du kan importera allt först och sedan använda export default för att exportera allt.

import * as filename1 from './filename1';
import * as filename2 from './filename2';

export default {
  ...filename1,
  ...filename2
};

Fungerar det här för dig?

Svar #2

Detta borde vara en kommentar, men hänvisa till detta svar. Du kan kombinera exports och ett enskilt default-export i en enda fil. Du måste göra lite arbete för att bygga standardobjektet på det sätt du vill, men följande bör fungera:

import * as filename1 from './filename1';
import * as filename2 from './filename2';

// build defaultObject as desired
const defaultObject = Object.assign({}, filename1, filename2)

export default defaultObject;
export * from './filename1';
export * from './filename2';