Rollup-plugin-typescript2: ¿Por qué se eliminan las declaraciones de interfaz?

Creado en 19 jul. 2017  ·  19Comentarios  ·  Fuente: ezolenko/rollup-plugin-typescript2

Hola,

Estoy tratando de pasar del paquete web al paquete acumulativo de una biblioteca y tengo problemas para que las declaraciones funcionen correctamente.

Parece que las declaraciones de interfaces no se exportan, esto es un problema cuando tengo cosas como:

import { RenderedCell } from "../RenderedCell";

export default class MergedCell implements RenderedCell {
    // ...
}

Recibo el error de que no se puede encontrar RenderedCell.
Trabajé en webpack y no puedo entender cuál es la diferencia en mi configuración que rompió esto. pero creo que entiendo que es normal con Rollup.

POR CIERTO. Estoy usando el último paquete acumulativo, rollup-plugin-typescript2 y rollup-plugin-uglify. Puedo publicar mis configuraciones si es necesario

Comentario más útil

Por lo que vale, simplemente llamo tsc --emitDeclarationOnly después del resumen, que anula los archivos de declaración en la carpeta de compilación.
en mi package.json

"scripts": {
    "build": "rollup -c",
    "postbuild: "tsc --emitDeclarationOnly"
}

Todos 19 comentarios

¿Es esto un error de tiempo de ejecución o un error de mecanografiado? ¿Podrías publicar cómo exportas la interfaz desde RenderedCell ?

El caso es que el archivo no se genera en absoluto y falla cuando se usa la biblioteca en otro proyecto.

Espera, ¿esperas que se genere la interfaz RenderedCell ? A partir del código que publicó mecanografiado, se esperaría que el archivo llamado RenderedCell.ts exista un directorio por encima del archivo actual y debería contener algo como esto:

export interface RenderedCell 
{ 
    // ...
}

¿Podría darnos más detalles sobre la estructura de su proyecto? (árbol de archivos, tsconfig, configuración acumulada, etc.)

sí, espero que se genere.

Aquí están mis configuraciones:

ejecutando la compilación: rollup -c -f es -n sq-web-component-table -o dist/sq-web-component-table.es.min.js

No puse todo el árbol porque es una biblioteca bastante grande y hay más ruido que señal. Pero ya puede ver que muchos archivos no se generan en dist.

rollup.config.ts

import typescript from 'rollup-plugin-typescript2';
import uglify from 'rollup-plugin-uglify';
import { minify } from 'uglify-es';

export default {
    entry: './src/index.ts',
    dest: 'dist/sq-web-component-table.min.js',
    sourceMap: true,

    plugins: [
        typescript(),
        uglify({}, minify)
    ]
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "es2015",
    "moduleResolution": "node",
    "declaration": true,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "outDir": "dist"
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "dist",
    "node_modules",
    "**/*-test.ts"
  ]
}

RenderedCell.ts

import {RenderedElement} from "./RenderedElement";
import {RenderedRow} from "./RenderedRow";
export interface RenderedCell extends RenderedElement {
    isMergedCell(): boolean;
    getColspan(): number;
    setColspan(colspan: number): void;
    getParent(): RenderedRow;
}

Árbol de archivos

.
├── src
│   ├── index.ts
│   └── table
│       ├── extensions
│       │   ├── base
│       │   │   ├── FirstTableExtension.ts
│       │   │   ├── LastTableExtension.ts
│       │   │   ├── SectionDispatcher.ts
│       │   │   ├── SectionManager.ts
│       │   │   └── SizeChangeMonitor.ts
│       │   ├── InvalidateEvent.ts
│       │   ├── InvalidateSizesEvent.ts
│       │   ├── RenderedCell.ts
│       │   ├── RenderedElement.ts
│       │   ├── RenderedRow.ts
│       │   ├── RenderedSection.ts
│       │   ├── RenderedTable.ts
│       │   ├── SectionClickedEvent.ts
│       │   ├── support
│       │   │   └── ...
│       │   ├── TableAttributes.ts
│       │   ├── TableExtensionChain.ts
│       │   ├── TableExtensionList.ts
│       │   └── TableExtension.ts
│       ├── model
│       │   └── ...
│       ├── TableRenderingOptions.ts
│       ├── Table.ts
│       ├── util
│       │   └── ...
│       └── view
│           └── ...
├── dist
│   ├── index.d.ts
│   ├── sq-web-component-table.es.min.js
│   ├── sq-web-component-table.es.min.js.map
│   ├── sq-web-component-table.min.js
│   ├── sq-web-component-table.min.js.map
│   └── table
│       ├── extensions
│       │   ├── base
│       │   │   ├── FirstTableExtension.d.ts
│       │   │   ├── LastTableExtension.d.ts
│       │   │   ├── SectionDispatcher.d.ts
│       │   │   ├── SectionManager.d.ts
│       │   │   └── SizeChangeMonitor.d.ts
│       │   ├── InvalidateEvent.d.ts
│       │   ├── InvalidateSizesEvent.d.ts
│       │   ├── RenderedRow.d.ts
│       │   ├── SectionClickedEvent.d.ts
│       │   ├── support
│       │   │   └── ...
│       │   ├── TableAttributes.d.ts
│       │   └── TableExtensionList.d.ts
│       ├── model
│       │   └── ...
│       ├── Table.d.ts
│       ├── util
│       │   └── ...
│       └── view
│           └── ...
├── node_modules
│   └── ...
├── __tests__
│   └── ...
├── package.json
├── rollup.config.js
└── tsconfig.json

Ah, ya veo. ¿Es la lib de código abierto por casualidad?

Intente construir con esas opciones:

typescript({ verbosity: 2, clean: true }),

Compruebe si se están procesando todos los archivos que espera. Si las declaraciones comienzan a generarse repentinamente, entonces hay un problema de caché en alguna parte.

Si RenderedCell.ts no se menciona en la salida ( rpt2: transpiling '...' ), aumente el nivel de detalle a 3 y compruebe si los archivos que se supone que deben importar lo están haciendo. Deberías ver algo como

rpt2: resolving '../RenderedCell'
rpt2:     to '...'

Si el problema no es obvio, agregaré más registros en algún lugar.

Me encantaría, podría serlo en el futuro :)

Gracias por los trucos, intentaré esto el lunes.

Si configura declaration: false en la sección compilerOptions de su tsconfig y lo vuelve a compilar, ¿el problema desaparece? En caso afirmativo, ¿el error informado por TSC está relacionado con uno de los archivos dentro del directorio dist? Si la respuesta a ambas es sí, ¿el error desaparece si introduce alguna lógica que no sea de tipo en el archivo que contiene el archivo RenderedCell , como una exportación de una función simple? Si es así, entonces la razón es que el archivo que contiene RenderedCell se considera no utilizado y Typecript nunca preparará declaraciones para él.

Si todo esto se aplica a usted, veo 2 opciones:

  • Deje de generar declaraciones para su paquete.
  • Asegúrese de que el roll-up no altere el archivo por completo al introducir cambios en el archivo que no estén relacionados con el tipo. Sí, es un truco y espero que encontremos una manera de hacerlo mejor.

Hola,

perdón por la larga demora, probé sus consejos y trucos pero todavía no pude obtener las definiciones de tipo para las interfaces generadas.

Cambié la configuración a typescript({ verbosity: 3, clean: true }) .
En la salida de la compilación generada no hay una sola mención de la interfaz RenderedCell .

Estoy 100% seguro de que se necesita este archivo, ya que el index.d.ts de la biblioteca lo requiere directamente y todos los archivos, excepto las interfaces, se generan, pero las interfaces todavía están en las importaciones de index.d.ts Archivo.

Profundizaré en el código para ver si hay una razón particular por la que esos archivos no se generan.

@wessberg Dejar de generar declaraciones para mi paquete no es una opción, ya que esta es una biblioteca que es parte de un proyecto más grande, todo escrito en TypeScript, por lo que si no tiene mecanografía, no funciona.

Entonces, investigué un poco y creé un repositorio que reproduce mi caso con un conjunto mínimo de configuración: https://github.com/onigoetz/typescript-rollup-experiment

También incluí una configuración de paquete web para comparar cómo lo hace funcionar el paquete web.

Mi comprensión del problema es que cuando rollup-plugin-typescript2 requiere la versión compilada de un archivo (digamos index.ts), Typecript devolverá los archivos compilados y sus importaciones, pero sin las interfaces en las importaciones.

Es por eso que el rollup nunca los genera: no tiene conocimiento de su existencia.

Para ejecutar el repositorio, haga npm install && npm run build dentro del directorio.

Si agrega:
import "./SomeInterface"; (exactamente así, - sin ningún enlace con nombre) a su archivo index.ts , debería funcionar. ¿Lo hace?

Desafortunadamente, Rollup no invoca el controlador de transformación de complementos para archivos de solo declaración, como archivos que solo contienen declaraciones de tipo. Lo anterior debería funcionar, ya que obliga a Rollup a evaluar el archivo. Este problema: https://github.com/rollup/rollup-plugin-typescript/issues/28 explica cómo y por qué existe este problema. Teóricamente, podríamos resolver manualmente todas las dependencias de su aplicación desde el punto de entrada y determinar aquellas que solo contienen declaraciones de tipo, pero no hay forma de forzar la acumulación para invocar el gancho de transformación (además de otras desventajas obvias, como mucha complejidad agregada del paso de compilación ).

Me temo que no podemos hacer mucho al respecto sin modificar el resumen en sí. Sin embargo, el "truco" que describí debería funcionar por ahora.

Sí, lo acabo de marcar, agregar import "./SomeInterface"; en el repositorio de prueba corrige las cosas.

Cuando se importan solo tipos, el mecanografiado omite las declaraciones de importación de la salida js y el resumen no ve esos archivos y, por lo tanto, no los envía para su transpilación.

Intentaré hacer trampa y monitorear qué archivos mecanografiados solicitó del disco frente a qué archivos se enviaron para su transpilación. Debería ser posible forzar la transferencia de la diferencia con solo definiciones de bandera. Esto podría resultar en demasiados archivos d.ts en algunos casos, pensé (porque el resumen de cosas se ha sacudido legítimamente del árbol, por ejemplo)

Gracias por investigarlo, también verificaré si puedo hacer una contribución para esto.

@onigoetz , ok, prueba tu proyecto con master. Verifique si se generan declaraciones correctas, pero también verifique que no se generen declaraciones inesperadas :)

Impresionante, lo arreglaste literalmente mientras dormía :)

Lo probé y casi funciona bien.

Solo hay un pequeño problema, pero creo que es algo contra lo que no podemos hacer nada, el cargador de paquetes web hace exactamente lo mismo y la lista de archivos la genera el propio TypeScript.

Como ejemplo; Si tengo tres archivos en mi repositorio:

  • index.ts importando SomeInterface.ts
  • SomeInterface.ts
  • nongenerated.ts importando SomeInterface.ts

nongenerated.ts nunca se hace referencia, pero sus tipos se generan de todos modos.

Genial, gracias por probar. Lo lanzaré un poco más tarde, después de que se confirme otro problema.

Sí, no podemos hacer mucho al omitir el resumen. Debería poder excluir esos archivos manualmente en la opción exclude , pero esa es una mala solución.

Ok, en 0.5.1 ahora

funciona bien, solo config tsconfig.json

{
    "compilerOptions": {
        "module": "es2015",
        "target": "es5",
        "declaration":true,
        "declarationDir": "lib",
        "typeRoots": [
            "node_modules/@six006",
            "node_modules/@types"
        ],
        "lib": [
            "es2015",
            "es2017",
            "es5"
        ],
    },
    "include": [
        "src/index.ts",
        "src/module/**/*.ts"
    ],
    "exclude": [
        "node_modules"
    ]
}

include sección

YMMV pero lo hice funcionar así ...

antes de

export type MyType = { ... };

después

type MyType = { ... };

export { MyType }

Por lo que vale, simplemente llamo tsc --emitDeclarationOnly después del resumen, que anula los archivos de declaración en la carpeta de compilación.
en mi package.json

"scripts": {
    "build": "rollup -c",
    "postbuild: "tsc --emitDeclarationOnly"
}
¿Fue útil esta página
0 / 5 - 0 calificaciones