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

515
Vistas
'T' podría instanciarse con un tipo arbitrario que podría no estar relacionado

Tengo que hacer un ejercicio con estructuras de datos, en concreto con una lista doblemente enlazada y no entiendo porque cuando intento añadir dos objetos a la lista me sale este error:

"El argumento de tipo '{ id_user: number; id_touristic_place: number; review_title: string; review_desc: string; review_points: number; }' no se puede asignar a un parámetro de tipo 'T'. 'T' podría instanciarse con un tipo arbitrario que podría no estar relacionado con '{ id_user: number; id_touristic_place: number; review_title: string; review_desc: string; review_points: number; }'.ts(2345)"

Intenté esto desde la documentación de TS

 public addAtEnd<T>(data: T): void

pero eso me da otro error relacionado con el nodo

Te agradecería si pudieras tratar de explicarme el porque del error. (Soy nuevo en TS)

Aquí está mi código:

 export class Node<T> { public data: T; public next: Node<T> | null; public prev: Node<T> | null; constructor(data: T) { this.data = data; this.next = null; this.prev = null; } }
 import { Node } from "./Node"; import { ILinkedList } from "./ILinkedList"; export class LinkedList<T> implements ILinkedList<T> { private head: Node<T> | null; constructor() { this.head = null; } public get gethead(): Node<T> | null { return this.head; } public set sethead(head: Node<T>) { this.head = head; } public addAtEnd(data: T): void { const newNode = new Node(data); if (!this.head) { this.head = newNode; } else { const getLast = (node: Node<T>): Node<T> => { return node.next ? getLast(node.next) : node; }; const lastNode = getLast(this.head); newNode.prev = lastNode; lastNode.next = newNode; } } public addTwo(): void { this.addAtEnd({ id_user: 1, id_touristic_place: 11, review_title: "Nice place", review_desc: "C:", review_points: 0, }); this.addAtEnd({ id_user: 2, id_touristic_place: 11, review_title: "Good", review_desc: "Not bad at all ", review_points: 0, }); } }
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Su clase LinkedList es genérica, lo que significa que no puede asumir que contiene ningún tipo específico de datos.

Si desea almacenar un tipo de datos en una lista, por ejemplo, User , debe especificar ese tipo. Esto normalmente se hace mediante la construcción de una instancia de LinkedList<User> .

También podría crear una clase ListOfUsers extends LinkedList<User> pero esto solo sería útil si hay una funcionalidad que se aplica a una lista de usuarios pero no se aplica a listas de ningún otro tipo de datos.

Por ejemplo:

 export class LinkedList<T> implements ILinkedList<T> { private head: Node<T> | null; constructor() { this.head = null; } public get gethead(): Node<T> | null { return this.head; } public set sethead(head: Node<T>) { this.head = head; } public addAtEnd(data: T): void { const newNode = new Node(data); if (!this.head) { this.head = newNode; } else { const getLast = (node: Node<T>): Node<T> => { return node.next ? getLast(node.next) : node; }; const lastNode = getLast(this.head); newNode.prev = lastNode; lastNode.next = newNode; } } } interface User { id_user: number; id_touristic_place: number; review_title: string; review_desc: string; review_points: number; }; const myList = new LinkedList<User>(); myList.addAtEnd({ id_user: 1, id_touristic_place: 11, review_title: "Nice place", review_desc: "C:", review_points: 0, }); myList.addAtEnd({ id_user: 2, id_touristic_place: 11, review_title: "Good", review_desc: "Not bad at all ", review_points: 0, });
over 4 years ago · Santiago Trujillo Denunciar

0

Le dice que el objeto que está pasando en esta línea no puede satisfacer todos los tipos T posibles.

 this.addAtEnd({ id_user: 1, id_touristic_place: 11, review_title: "Nice place", review_desc: "C:", review_points: 0, });

Como una de las infinitas posibilidades, si T es un number , entonces solo sería legal pasar un number (como en this.addAtEnd(4) ), pero su código no pasa un number .

El propósito de un código genérico es que su código funcione con cualquier tipo y, como resultado, no puede hacer suposiciones sobre ese tipo, a menos que le agregue restricciones. Para su función addTwo , no podrá crear un objeto ad-hoc que coincida con todas las T posibles, por lo que lo único práctico que podría hacer es que acepte los datos como argumentos. Con eso, quien esté usando esta clase puede proporcionar datos del tipo que tiene en mente.

 public addTwo(first: T, second: T): void { this.addAtEnd(first); this.addAtEnd(second); }
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