angular - Hvordan håndtere TypeScript-verdier med flere typer på riktig måte
Jeg har følgende TS-grensesnitt
export interface Item {
product: string | Product;
}
Når jeg vil iterere gjennom en rekke elementer, må jeg eliminere typen. Med andre ord
items = Items[];
items.forEach(item => {
item.product._id
})
kommer ikke til å fungere fordi egenskapen ikke kan brukes på strenger. Derfor må jeg forhåndssjekke typen, dvs.:
items = Items[];
items.forEach(item => {
if (typeof item.product === 'object') item.product._id
})
Jeg liker egentlig ikke hvordan det ser ut. Hvordan håndterer du denne situasjonen?
Svar #1
Det bør være typebeskyttere for å avgrense typen:
if (item.product && typeof item.product === 'object') item.product._id
Eller :
if (item.product && typeof item.product !== 'string') item.product._id
Hvis det er en mulighet for at item.product er en streng, som grensesnittet antyder, er denne sjekken nødvendig.
Ellers bør typen bekreftes:
items.forEach(item => {
(item.product as Product)._id
})
Svar #2
Dette kan høres rart ut, men den første/beste tilnærmingen bør være «ikke ha en klassevariabel med blandet type string | produkt».
Hva er ditt spesifikke brukstilfelle? Hvorfor finnes noen produkter som strenger og noen som klasser? Er det mulig å lage en instans for strengklassene også?
Hvis dette på en eller annen måte ikke er mulig av en eller annen grunn, kan du sjekke med instanceof for riktig type (ikke sjekk med typeof === 'object', da det ikke er helt trygt)
if (item instanceof Product) { // do logic }}
