Búsqueda de sitios web

javascript - Typescript - implementar una interfaz sin implementar las interfaces padres


Actualmente tengo las siguientes interfaces definidas en un proyecto

interface foo {
  fooProperty: number;
  fooFunction(): void;
}

interface bar extends foo {
  barProperty: string;
  barFunction(): void;
}

Ahora quiero definir una clase como

class myBar implements bar {
  public barProperty: string ="bar";
  public barFunction() {
    // do dosmething
  }
}

Sin embargo, no quiero tener que implementar las funciones y propiedades de foo también, ya que estas ya están definidas en una clase de JS existente que las interfaces definen.

Esencialmente, lo que estoy tratando de hacer es crear una clase de TypeScript que se extienda de una biblioteca JS de terceros para la cual tengo archivos "d.ts" que describen la implementación, pero que NO está en TypeScript en su forma de origen.

Para poder usar una función particular en la biblioteca de terceros, tengo que crear una clase personalizada que derive de una clase que ellos proporcionan en JS, pero que luego sobrescribo usando "prototype", sin embargo, necesito hacer esto usando TypeScript.

Actualización 1

Parece que las personas que están leyendo esto no están entendiendo del todo lo que intento lograr aquí, así que déjenme elaborar un poco más.

En el proyecto en el que estoy trabajando usamos una librería de JS de terceros, llamémosla "thirdLib.js"

Dentro de "thirdLib.js" hay funcionalidad que, para usarla, requiere que extienda una clase de estilo JS proporcionada como parte de "thirdLib.js" de la siguiente manera:

function myClass(){
  thirdlib.thirdclass.call(this);
}

thirdLib.utilities.extendclass(myClass, thirdLib.thirdClass);

myClass.prototype.overriddenFunc = function(){
  // Do custom function here
}

El método "extendClass" en "thirdlib" copia el constructor de la clase de la que estoy derivando en mi constructor o eso es lo que me hacen creer.

Que luego se utiliza más adelante, en otra parte de "thirdlib.js", por ejemplo:

var myStuff = new thirdLib();
var theClass = new myClass();

myStuff.registerSomething(theClass);
myStuff.doAThing();

En el momento en que llamo a "doAThing", thirdLib.js tiene registrada la nueva clase de JS, y esa clase tiene TODA la funcionalidad original presente en "thirdClass" pero con MIS personalizaciones añadidas a ella.

Todo lo que tengo para "thirdLib.js" es el código JavaScript (minificado) y un conjunto de archivos de definición de Typescript (que he escrito yo mismo, ya que no se proporcionaron con la librería), y necesito poder crear "myClass()" usando la funcionalidad normal de Typescript, mientras sigo extendiendo y usando todo lo que está en la clase JS original, y al mismo tiempo poder agregar mi funcionalidad a la clase TS y que esta reemplace la funcionalidad en la clase JS base cuando lo haga.

Actualización abril 2022

Para aquellos que se preguntan, aproximadamente 6 meses después de mi último comentario dejé la empresa para la que estaba haciendo este proyecto, y por lo tanto nunca llegué a verlo hasta su resolución, ya que no tengo el código ni acceso a él, dudo mucho que alguna vez se resuelva. Para aquellos que estén interesados, el "Manejador de Dibujo Personalizado" que estaba tratando de implementar, era una clase de dibujo personalizada para una librería JS de terceros (entonces comercial, ahora es de código abierto) llamada "MXGraph"

Respuesta #1

Si entendí bien tu problema, podrías simplemente hacer que tu clase myBar extienda la clase myFoo, heredando así la implementación dada y cumpliendo con los criterios definidos en la interfaz.

Artículos relacionados