Búsqueda de sitios web

javascript - Publicar un paquete de Typescript que depende de un paquete npm de terceros


Estoy construyendo un paquete/biblioteca sencillo de Typescript que se compila usando esta variante de un tsconfig (probé todo tipo de configuraciones sin éxito) con typescript v2.8:

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "target": "es5",
    "lib": ["es6", "dom"],
    "module": "umd",
    "moduleResolution": "node",
    "declaration": true,
    "declarationDir": "dist/types",
    "outDir": "dist/lib",
    "typeRoots": [
      "node_modules/@types",
    ],
  }
}

y un package.json que se ve así:

{
  "name": "FooBarLib",
  "version": "0.0.0",
  "description": "A simple library",
  "main": "dist/lib/index.js",
  "typings": "dist/types/index.d.ts",
  "author": "Gabriel C. Troia",
  "license": "MIT",
  "dependencies": {
    "@types/ramda": "^0.25.35",
    "@types/react": "^16.4.7",
    "@types/react-dom": "^16.0.6",
    "ramda": "^0.25.0",
    "react": "^16.4.1",
    "react-dom": "^16.4.1",
    "styled-components": "^3.3.3"
  },
  "devDependencies": {
    "typescript": "2.8"
  },
  "peerDependencies": {
    "ramda": "^0.25.35",
    "react": "^16.4.1",
    "styled-components": "^3.3.3"
  },
  "scripts": {
    "prebuild": "rm -rf dist",
    "build": "tsc"
  }
}

Como puedes ver arriba, mi biblioteca FooBarLib depende de un montón de bibliotecas externas como react y ramda. Todo se compila localmente y puedo generar archivos js transpilados así como archivos de definición de tipos.

Pero, cuando intento importarlo en un proyecto de TypeScript separado (usando TypeScript v2.9.2), el compilador no puede encontrar ninguno de los tipos de bibliotecas de terceros usados en mi FooBarLib (react, ramda, etc.), aunque estén instalados en los node_modules del proyecto, fallando así con uno de los errores: No se puede encontrar el módulo 'react' o No se puede encontrar el módulo 'ramda', etc...

Ejemplo de un archivo d.ts generado:

/// <reference types="ramda" />
import * as R from 'ramda';
export declare const myCurriedFunction: R.CurriedFunction2<string | undefined, string | string[] | undefined, string>;

Además, no parece importar si /// <reference types="ramda" /> está presente o no. Ocurre el mismo error.

Además, el proyecto que importa FooBarLib tiene @types/ramda instalado localmente.

Es frustrante y no parece que pueda encontrar mucha información sobre esto, excepto por este proyecto https://github.com/alexjoverm/typescript-library-starter, pero solo usar tsconfig o package.json no funcionó.

Actualizar

Descubrí que al importar manualmente las dependencias de terceros en la implementación del proyecto, esto permite que se compile con éxito.

import { foo } from 'FooBarLib';

// 3rd party dependencies
import { StyledComponentClass } from 'styled-components';
import * as React from 'react';
import * as R from 'ramda';

foo();

El problema con esta solución es que, además de ser excesivamente verborreica sin razón, también falla si noUnusedLocals está configurado en true.

Artículos relacionados