Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

192
Vistas
¿Por qué TypeScript permite la implementación del método esperando que el número o la cadena solo acepten el número?

applyDamage un método applyDamage para aceptar number o string , pero lo implementé solo con un argumento number . Cuando llamo a este método usando la clase base, tengo un comportamiento incorrecto. ¿Por qué TypeScript no muestra un error?

 interface Character { applyDamage(value : number): number; } interface Humanoid extends Character { hp:number; applyDamage(value: number|string): number } class Monster implements Humanoid { hp:number = 10; applyDamage(v: number) { this.hp -= v; return v; } } const monster:Humanoid = new Monster(); monster.applyDamage("hello"); console.log(monster.hp); // <-- NaN
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Definió la firma del método en Humanoid para applyDamage para tomar un valor de entrada de string | number ;

TS solo verifica que su implementación para la clase Monster tenga la firma adecuada y devuelva el tipo definido. Depende de usted escribir un cuerpo de método que sea seguro.

Parece que tal vez quieras usar una sobrecarga. https://www.typescriptlang.org/docs/handbook/2/functions.html#function-overloads

over 4 years ago · Santiago Trujillo Denunciar

0

Como han señalado otros: una sobrecarga funcionaría... pero por la forma en que leo su código, parece que solo desea implementar un subtipo del parámetro de unión, por lo que creo que los genéricos son la respuesta correcta a su problema. Al proporcionar también un parámetro de tipo predeterminado para los genéricos, se pueden usar de forma más ergonómica.

Parque infantil TS

 interface Character<T extends string | number = number> { applyDamage (value: T): number; } interface Humanoid<T extends string | number = string | number> extends Character<T> { hp: number; } class Monster implements Humanoid<number> { hp: number = 10; applyDamage(v: number) { this.hp -= v; return v; } } ////////// Use: const monster: Humanoid<number> = new Monster(); // You could also just write it this way: // const monster = new Monster(); monster.applyDamage("hello"); /* ^^^^^^^ Argument of type 'string' is not assignable to parameter of type 'number'.(2345) */ console.log(monster.hp); //=> NaN
over 4 years ago · Santiago Trujillo Denunciar

0

Desafortunadamente, esta es una de las lagunas en la seguridad de tipos causada por el hecho de que los parámetros del método se verifican de forma bivariante. Esto significa que siempre que haya una relación entre los parámetros de la función, no importa en qué dirección sea esa relación.

Aquí hay un enlace a la sección relacionada del manual de TypeScript: Función Parámetro Bivarianza

El razonamiento para esto se explica en el PR que introduce tipos de función estrictos (es decir, tipos de parámetros contravariantes para firmas de funciones) y es básicamente que si los métodos se verificaran de forma contravariante, la mayoría de los tipos genéricos serían invariantes (por lo que no podría asignar Array<Cat> a Array<Animal>

Una solución es evitar las firmas de métodos y usar firmas de funciones siempre que sea posible:

 interface Character { applyDamage: (value : number) => number; } interface Humanoid extends Character { hp:number; applyDamage: (value: number|string) => number } class Monster implements Humanoid { hp:number = 10; applyDamage(v: number) { // error this.hp -= v; return v; } } const monster:Humanoid = new Monster(); // error monster.applyDamage("hello"); console.log(monster.hp); // <-- NaN

Enlace del patio de recreo

Si desea obtener más información sobre la varianza, puede ver mi presentación aquí .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda