Búsqueda de sitios web

typescript - TS2351: Cómo crear tipos de constructor para `new function()` en ts


Estoy creando un paquete npm, que exporta por defecto una clase. Este módulo está escrito en es3, pero quiero proporcionar types.ts

index.js (en mi paquete)

function MyClass(p1, p2) {
  // code
}

module.exports =  MyClass;

Ok, entonces creé tipos index.d.ts (dentro de mi paquete, al lado de index.js):

declare module 'mypackageid' {
  interface MyClass {
    new (div: HTMLElement, conf: any): MyClass;
  }
  export var MyClass: MyClass;
}

Puedo usar fácilmente este código en es3 y funciona. (fuera de mi paquete, por ejemplo, desde otro paquete)

var myInstance = new MyClass()

Pero si quiero usarlo desde otro paquete dentro de un archivo .ts:

import MyClass from 'mypackageid';

new MyClass(divReference, { // <-- error points to this line
    onBlobPaste: e=> {
      console.log(e);
    },
});

El cargador de Typescript se niega a compilar y muestra:

TS2351: No se puede usar 'new' con una expresión cuyo tipo no tiene una firma de llamada o de construcción.

EDICIÓN 1:

Usas una exportación por defecto de commonjs en tu archivo .ts, tu archivo .d.ts especifica una exportación de miembro, y tu consumidor espera una exportación por defecto de ES6. ¿De qué manera estás tratando de exportarlo realmente? Tienes que elegir una.

No importo explícitamente tipos, espero que TypeScript detecte automáticamente los tipos de 'index.d.ts'. Si uso la exportación por defecto así:

declare module 'mypackageid' {
  interface MyClass {
    new (div: HTMLElement, conf: any): MyClass;
  }
  export default MyClass
}

Obtendré el siguiente error. El error apunta a la línea con new

S2693: 'MyClass' solo se refiere a un tipo, pero se está utilizando como un valor aquí.

Respuesta #1

Si utilizas el enfoque exports= en tu módulo, y por lo tanto reemplazas toda la exportación de tu módulo, necesitarás usar import=, y un sistema de módulos que lo soporte (como AMD o commonjs). Consulta la documentación

mypackageid.d.ts
declare module 'mypackageid' {
    class MyClass {
        constructor(div: HTMLElement, conf: any);
    }
    export = MyClass;
}


//Usage
import MyClass = require('mypackageid')

new MyClass(null, null)

Además, si quieres usar una interfaz con new, eso no puede ser la exportación (ya que es un tipo), necesitas declarar un const y exportarlo:

declare module 'mypackageid' {
    interface MyClassCtor {
        new (div: HTMLElement, conf: any) : {};
    }
    const MyClass : MyClassCtor;
    export = MyClass;
}

Artículos relacionados