Learn TypeScript Help

Adding Support for Another Type

O problema que temos agora com a PeopleCollection é que ela só aceita objetos de Person, assim se eu quiser ter as mesmas operações para uma collection responsavel por Product a primeira abordagem não muito boa seria duplicar as features que temos na collection de PeopleCollection para algo como ProductCollection, mas isso não é uma abordagem boa, então a melhor forma seria criar uma classe generica para receber tanto Person como Product:

import {Person, Product} from "./dataTypes"; let people = [new Person("Bob Smith", "London"), new Person("Dora Peters", "New York")]; let products = [new Product("Running Shoes", 100), new Product("Hat", 25)]; type dataType = Person | Product; class DataCollection { private items: dataType[] = []; constructor(initialItems: dataType[]) { this.items.push(...initialItems); } add(newItem: dataType) { this.items.push(newItem); } getNames(): string[] { return this.items.map(item => item.name); } getItem(index: number): dataType { return this.items[index]; } } let peopleData = new DataCollection(people); console.log(`Names: ${peopleData.getNames().join(", ")}`); let firstPerson = peopleData.getItem(0); if (firstPerson instanceof Person) { console.log(`First Person: ${firstPerson.name}, ${firstPerson.city}`); }

Fazemos isso com o type union de Person e Product:

type dataType = Person | Product;

E depois definimos que a propriedade items vai receber um array desse type:

private items: dataType[] = []

E todos os tipos de retorno e entrada dos metodos serão datatype assim conseguimos garantir um tipo que aceitara tanto Personcomo Product:

class DataCollection { private items: dataType[] = []; constructor(initialItems: dataType[]) { this.items.push(...initialItems); } add(newItem: dataType) { this.items.push(newItem); } getNames(): string[] { return this.items.map(item => item.name); } getItem(index: number): dataType { return this.items[index]; } }
01 December 2025