typescript - TypeScript generisk syntax för en array som innehåller en annan array
Jag försöker hitta den korrekta syntaxen för gränssnittet där en array innehåller en annan array. Den yttre arrayen innehåller den inre arrayen.
Jag letar inte efter logik i koden
export function deleteNestedArrayItem<U, T<U> >(
outerArray: T[],
outerIndex: number,
innerIndex: number
) {
//code does here
}
Kan inte förstå syntaxen för den generiska <U, T<U> >.
De associerade datastrukturerna är
export class Item {
constructor(public title: string, public description: string) {}
}
export class Skill {
constructor(public id: string, public name: Item, public proficiency: number) {}
}
export class Category {
constructor(public id: string, public name: string, public skills: Skill[]) {}
}
Instanserad här:
const skill1 = new Skill(uuid(), new Item('HTML', ''), 9);
const skill2 = new Skill(uuid(), new Item('TypeScript', ''), 5);
const skill3 = new Skill(uuid(), new Item('Unix', ''), 7);
const skill4 = new Skill(uuid(), new Item('Windows', ''), 9);
const skill5 = new Skill(uuid(), new Item('Illustrator', ''), 9);
const skill6 = new Skill(uuid(), new Item('Latex', ''), 9);
const cat1 = new Category(uuid(), 'Languages', [skill1, skill2]);
const cat2 = new Category(uuid(), 'Operating Systems', [skill3, skill4]);
const cat3 = new Category(uuid(), 'Miscellaneous', [skill5, skill6]);
const initialState: State = {
categoryList: [cat1, cat2, cat3],
};
Svar #1
Jag kan inte förstå varför du behöver id:n för arrayer. Arrayer är ordnade datastrukturer och bör inte innehålla egna egenskaper som objekt.
Om en array av objekt med ID:n är lämplig för ditt fall, skulle jag göra så här:
interface HasId {
id: string
}
function deleteArrayItemById(arr: HasId[], id: string) {
return arr.filter(item => item.id !== id);
}
let a: HasId = { id: '1' };
let b: HasId = { id: '2' };
const result = deleteArrayItemById([a, b], '1');
console.log(result); // [{id: '2'}]
Om det inte är vad du letar efter, vänligen beskriv dina datastrukturer med ett exempel.
Uppdatera
Tack för exemplen på datastrukturer. Jag är nyfiken, varför behöver du använda generics för din deleteNestedArrayItem-funktion?
function deleteNestedArrayItem(categoryList: Category[], categoryId: number, skillId: number) {
// 1. find a category by categoryId
// 2. find a skill in category by skillId
// 3. delete the item
}
Den här funktionssignaturen verkar täcka dina behov.
