How to Create a Typescript Library with both Default and Named Exports?

I've been enjoying exploring the different ways React can be imported, from using import React from 'react' to importing specific components with destructuring like

import { useEffect } from 'react'
, or even cheekily doing
import * as Whatever from 'react'
. Now I'm on a mission to create my own TypeScript library for npm that can be imported in all these ways, along with the traditional require syntax. I've put in around 15 hours so far, but haven't quite cracked it (frustrating).

Currently, I'm utilizing rollup to build lib/cjs and lib/esm to support both CommonJS and Modules. Additionally, typescript-compiler (tsc) is generating type files stored inside /lib/types.

However, my biggest roadblock is figuring out how to export my files similarly to how React does it. At the moment, I'm using an index.ts "barrel file" at the root of my library, which looks something like this:

export * from './filename1' export * from './filename2' ...

But this setup doesn't include a default export for my library. Do I need to perform some sort of magic with an index.d.ts module declaration? Any advice or tutorials on creating a TypeScript library would be greatly appreciated. While I've managed to make either default imports or named imports work for my library individually, I'm struggling to get them both working together.

Answer №1

If you prefer, you have the option to import all modules initially and subsequently utilize export default to globally export them.

import * as module1 from './module1';
import * as module2 from './module2';

export default {
  ...module1,
  ...module2
};

Is this approach suitable for your needs?

Answer №2

This is a helpful tip for combining exports and default export in one file. By merging the contents of two modules, you can create a default object that includes both sets of functionality.

import * as module1 from './module1';
import * as module2 from './module2';

// Create a new object by merging module1 and module2
const defaultObject = Object.assign({}, module1, module2);

export default defaultObject;
export * from './module1';
export * from './module2';

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Guide to automatically closing the calendar once a date has been chosen using owl-date-time

Utilizing Angular Date Time Picker to invoke owl-date-time has been functioning flawlessly. However, one issue I have encountered is that the calendar does not automatically close after selecting a date. Instead, I am required to click outside of the cal ...

Leveraging existing providers in Angular 2

What are the possible uses for the useExisting provider? Is it more akin to useExistingOrThrowIfThereIsNone or useExistingOrCreateIfThereIsNone? Is there a way to intentionally choose between these behaviors depending on our specific requirements? If one ...

How to invoke a method in a nested Angular 2 component

Previous solutions to my issue are outdated. I have a header component import { Component, OnInit } from '@angular/core'; import { Router, NavigationEnd } from '@angular/router'; import { Observable } from 'rxjs/Observable'; ...

Whoops! Looks like there was a hiccup with the Vercel Deployment Edge Function, causing an

Every time I attempt to send a POST request to my Edge Function on Vercel Deployment, I encounter the following error message: [POST] /api/openai reason=EDGE_FUNCTION_INVOCATION_FAILED, status=500, user_error=true TypeError: Illegal invocation at app/api/ ...

Using the js-cookie library in a TypeScript-based project: A guide

Looking to incorporate the js-cookie library into my TypeScript project. After installing the library and typings with the command npm install js-cookie @types/js-cookie --save-dev in the location containing node_modules and package.json, my package.json ...

Attributes for MenuList in React Select

const { MenuList } = components; const CustomMenuList = ({ ...props }: any) => { console.log(props); return ( <div> <MenuList {...props} /> <hr className="m-0" /> <div className="tex ...

How can I alleviate TypeScript compiler error TS2339 warnings?

Utilizing the TypeScript compiler has been instrumental in my coding process, as it allows me to catch potential defects at an early stage. One particular warning that the compiler flags is TS2339, which verifies if a type has a specific property defined. ...

Managing data, functions, and tasks consistently in an Electron-based React application despite navigating through various components - how to do it effectively?

As a newcomer to React, I have encountered several challenges while trying to implement certain features. Currently, I am working on an application that consists of a grid view and details view. Initially, I used props and functions to manipulate the state ...

Submitting a form using an anchor tag in Angular 8: A step-by-step guide

I have a question about how to submit form data using hidden input fields when a user clicks on an <a> tag. <form action="/submit/form/link"> <input type="hidden" [attr.value]="orderNumber.id" /> <input type="hidden" [attr.value]= ...

Having trouble retrieving the data returned from the service in an angular component

Having trouble retrieving data from a service in an Angular component. Here is the service code: getData(fromDate: string, toDate: string): Observable<WfAverageTime[]> { const url ="http://testApi/getData" return this.http.get< ...

Is there a way to loop through objects in Angular 2

I am working with an Array of Objects named comments, and my goal is to select only the ones that have a specific post id and copy them to another array of objects. The issue I am facing is finding a way to duplicate the object once it has been identified. ...

Creating a progressive prototype chain in TypeScript: A step-by-step guide

With JavaScript, it is possible to create a "derived class" whose "base class" is dynamic using code like the following: function NewBaseClass(sF) { function DynamicBaseClass(iF) { this.instanceField = iF; } // EDIT: oops, this is not really static i ...

Creating a Proxy for an Array in TypeScript: A Step-by-Step Guide

When attempting to utilize a Proxy for adding logic whenever a value in my array is set to a new value, I encountered an issue with TypeScript. The error arises from the fact that TypeScript does not support indexing an array with anything other than a num ...

Having trouble utilizing Vue3 methods while utilizing the `<script setup lang="ts">` syntax

Looking to incorporate Vue into a non-Vue Class using the Composition API for a Chrome Extension project where having the entire thing as a Vue App doesn't make sense. The Vue Instance is being instantiated in the usual manner and then injected into ...

Trouble with querying NG elements using "queryAll(By.css)" in Angular and Jasmin unit testing

I've encountered an unusual problem that needs to be resolved for me to successfully complete a unit test for a project I'm currently engaged in. Here is what my unit test currently looks like: it('should display the navbar list', ...

New to React and struggling with updating the DOM

Upon receiving a React project, I am faced with the task of performing a complex state update on my DOM. Here is how my component looks: /** @jsx jsx */ import { jsx } from '@emotion/core'; import { Typography } from '@material-ui/core&ap ...

Submitting Data in Ionic 3 using Http Post and Storing in Sqlite with Angular 4

I am facing an issue while trying to post an array of contacts on a WebService. When I send the array, the data appears as NULL in the WebService response. I am confused about how to use Let params{} The error message shows "object undefined". Addition ...

Advanced automatic type inference for object literals in TypeScript

When working with TypeScript, I often declare generic functions using the syntax: const fn: <T>(arg: T)=>Partial<T> While TypeScript can sometimes infer the type parameter of a function based on its parameters, I find myself wondering if t ...

Ways to incorporate additional parameters into an object

Is there a way to incorporate new parameters into objects during a foreach loop in JavaScript? const data = [big data]; data.forEach(async e => { Object.assign(e, {newData: 'string'}; console.log(e); //new parameter added }) console.lo ...

The issue arose as a result of a SQLITE_ERROR, specifically mentioning that the Users table does not exist. However, the model has been

Greetings! I am currently facing an issue while trying to integrate the "sequelize-typescript" library into my Express.JS REST API that I developed using Dependency Injection. The error I am encountering is: SQLite Error: no such table: Users Below is th ...