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): voidpero 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, }); } }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, });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); }