javascript - Asigură-te că parametrul este un tablou
Încerc să găsesc o metodă de a verifica dacă un parametru al unei funcții este un tablou sau nu. Dacă nu este, să-l transform într-un tablou și să aplic o funcție pe el, altfel doar să aplic funcția pe el.
Exemplu :
interface employee {
first: string,
last: string
}
function updateEmployees (emp: employee | employee[]) {
let employees = [];
if (emp instanceof Array) employees = [emp];
else employees = emp;
employees.forEach(function(e){
return 'something'
})
}
Mi se pare că asta ar funcționa pentru mine, dar generează un avertisment de Type 'employee' is not assignable to type 'any[]'. Property 'length' is missing in type 'employee'.
Răspuns #1
Iată versiunea corectată a funcției tale:
function updateEmployees (emp: employee | employee[]) {
let employees: employee[] = [];
if (emp instanceof Array) employees = emp;
else employees = [emp];
employees.forEach(function(e){
return 'something'
})
}
Dar poate fi mai scurt:
function updateEmployees(emp: employee | employee[]) {
(emp instanceof Array ? emp : [emp]).forEach(function(e){
return 'something'
})
}
Răspunsul #2
Iată o funcție tip-sigură care asigură un tablou, (folosind Typescript). De asemenea, verifică dacă elementul este null sau undefined, și returnează un tablou gol dacă este așa, în loc să îl adauge la un tablou.
function ensureArray<T>(value: T | T[]): T[] {
if (Array.isArray(value)) {
return value
} else if (value === undefined || value === null) {
return []
} else {
return [value]
}
}
Dacă DORIȚI un tablou care să conțină null sau undefined:
function ensureArray<T>(value: T | T[]): T[] {
if (Array.isArray(value)) {
return value
}
else {
return [value]
}
}
Pentru exemplul tău, utilizarea ar fi:
function updateEmployees (emp: employee | employee[]) {
ensureArray(emp).forEach(function(e){
return 'something'
})
}
Observați că un element null sau undefined nu va crea o eroare de execuție folosind verificarea suplimentară. Și elementul din bucla dvs. este acum de tipul 'employee'.
