Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

521
Visualizações
'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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda