Applying a Type Parameter to a Method
O problema anterior:
O método collate dependia de um segundo parâmetro genérico (U).
Esse parâmetro era definido na classe, o que obrigava a escolher o tipo de U no momento da criação do objeto DataCollection.
Isso limitava a flexibilidade, já que só era possível usar um único tipo para collate em toda a instância.
Solução:
O parâmetro U foi movido para o método collate.
Assim, cada chamada de collate pode usar um tipo diferente.
Isso torna a classe mais reutilizável e flexível.
import {City, Person, Product, Employee} 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)];
let cities = [new City("London", 8136000), new City("Paris", 2141000)];
let employees = [
new Employee("Bob Smith", "Sales"),
new Employee("Alice Jones", "Sales")
];
class DataCollection<T extends { name: string }> {
private items: T[] = [];
constructor(initialItems: T[]) {
this.items.push(...initialItems);
}
collate<U>(targetData: U[], itemProp: string, targetProp: string): (T & U)[] {
let results = [];
this.items.forEach(item => {
let match = targetData.find(d => d[targetProp] === item[itemProp]);
if (match !== undefined) {
results.push({...match, ...item});
}
});
return results;
}
}
let peopleData = new DataCollection<Person>(people);
let collatedData = peopleData.collate<City>(cities, "city", "name");
collatedData.forEach(c => console.log(`${c.name}, ${c.city}, ${c.population}`));
let empData = peopleData.collate<Employee>(employees, "name", "name");
empData.forEach(c => console.log(`${c.name}, ${c.city}, ${c.role}`));
03 December 2025