Hur man kompilera TypeScript-moduler med baseUrl/paths-inställningar i tsconfig


Jag utvecklar komponentbibliotek som distribueras via npm och använder aktivt baseUrl-inställningen i tsconfig. Det är verkligen fantastiskt, så jag kan enkelt skriva

// <prjRoot>/src/some/deeply/nested/module
import { Component } from 'components';

istället för fruktansvärt

// <prjRoot>/src/some/deeply/nested/module
import { Component } from '../../../src/components';

Dessutom distribuerar jag inte en kompilerad bundle, utan rena separata es6-moduler. Jag har en huvudfil index.ts med omexporter som detta

export * from './src/components';
export * from './src/another-dir-components';

Och här kommer tiden att bygga paket och publicera det till npm - TS ersätter inte sökvägar med relativa. Användare får ett fel som "Kan inte hitta modulen 'components'", eftersom deras TypeScript (eller de kanske inte använder TS alls) eller Webpack inte vet något om min baseUrl-inställning.

Det finns en lösning via babel - babel-plugin-module-resolver

Det fungerar, men bara för kod. Om jag har sådan kod

import { Component } from 'components'; // actually <prjRoot>/src/components/index.ts
import { SomeInterface } from 'typings'; // <prjRoot>/src/typings/index.ts
...
export default Klass extends React.Component {}

Jag ska få

file.js. TS startade allt om typer (t.ex. import { SomeInterface }), sedan transpilerar Babel koden och ersätter from 'components' med from '../../../components'. Perfekt:

import { Component } from '../../../components';
...
/*#__PURE__*/
var Klass = (function (React.Component) {...transpiled babel code...})(React.Component);
export { Klass as default }

file.d.ts (fortfarande INTE relativ sökväg, kommer att bli ett fel):

import { SomeInterface } from 'typings';
...