Soy nuevo en Typescript y me encontré con la siguiente pregunta al intentar implementar una interfaz en una clase:
interface TestInterface { x: number } class Test implements TestInterface { constructor() { this.x = 0 } } // Class 'Test' incorrectly implements interface 'TestInterface'. // Property 'x' is missing in type 'Test' but required in type 'TestInterface'.
Pero si agrego x: number
a Test
before constructor
, funciona. Entonces, supongo que si desea verificar el tipo de una propiedad inicializada en el constructor
, debe especificarlo en la clase misma. Entonces, ¿para qué sirve el implement
y la interface
? Y si quiero usar la interfaz para verificar el tipo de sus instancias, ¿no sería repetitivo ya que tengo que escribirlo en dos lugares?
El código en un constructor no es algo que Typescript pueda verificar para determinar si su clase implementa correctamente la interfaz. Sería imposible que Typescript verificara todas las asignaciones en su código para asegurarse de que los tipos sean correctos, por lo que debe declarar los tipos de forma estática. El objetivo de interface
y los implements
no es reducir la cantidad de código que tiene que escribir, sino declarar el tipo de objetos en su código, de modo que Typescript pueda verificar estáticamente que su código es autoconsistente con respecto a los tipos.
Al decir que la clase implementa la interfaz, le está pidiendo a Typescript que lo mantenga honesto y verifique que los tipos sean realmente consistentes. Si Typescript simplemente confiara en que haría lo correcto en su constructor, ¡no sería muy efectivo! Tenga en cuenta que los constructores pueden contener lógica condicional, bucles y otro código que significa que, incluso en principio, no es posible que Typescript analice el código del constructor para determinar si está manteniendo el contrato al que se compromete con implements
.
Entonces, supongo que si desea verificar el tipo de una propiedad inicializada en el constructor, debe especificarlo en la clase misma.
¡Tienes toda la razón!
Entonces, ¿para qué sirve el implemento y la interfaz?
Una interfaz pretende ser un "contrato". Aquí hay un ejemplo simple:
interface Connectable { connect: () => Promise<void> } const robustConnect = async (connection: Connectable) => { try { await connection.connect(); } catch (error) { console.warn(`there was an error, let's try once more`); await connection.connect(); } }
En este ejemplo, escribimos la función robustConnect
para que pueda recibir cualquier objeto que tenga un método de connect
. Este es el uso más útil de una interfaz: dar un nombre a un tipo para que sea más legible .
En otros lenguajes OO, una interfaz sería la única forma de declarar un tipo como ese, y tendría que extender la interfaz para usar robustConnect
. De lo contrario, el paso de compilación fallaría. Dado que javascript no es inherentemente un lenguaje orientado a objetos y se escribe dinámicamente, esa restricción no existe. Entonces, la palabra clave implements
puede parecer inútil. En el mejor de los casos, podría usarlo para ayudarse a sí mismo al escribir clases: simplemente use la palabra clave implements
y deje que el compilador de TypeScript le diga lo que se está perdiendo. Pero eso es todo.
Espero que esto ayude.
Low key Necesitas aprender Programación Orientada a Objetos. Su pregunta es un principio básico de oop.
Cuando encuentra un nuevo trabajo, firma un contrato, el contrato especifica su función, deberes, comportamiento y más; por lo tanto, debe seguir el contrato, por lo que si implementa una interfaz, su clase debe seguir la estructura de su interfaz.
Si, por ejemplo, encuentra que es redundante en lugar de crear una clase, use objetos puros
const obj:Obj ={ name: “eneto” };
Además también su declaración " Pero si agrego x: número a Prueba antes del constructor, funciona. Entonces, supongo que si desea verificar el tipo de una propiedad inicializada en el constructor, debe especificarlo en la clase misma. Entonces, ¿para qué sirve el implemento y la interfaz? ” no tiene sentido, porque mecanografiado verifica su código en la fase de compilación, pero una vez que su código se compila, se convierte en JavaScript que no tiene tipos estáticos