#reactjs
#reactjs
Вопрос:
У меня есть 2 функции react ниже
const hasPermission = (permission: string) => {
if (user?.permissionsEnabled === false) {
return true
}
return permissions.includes(permission) || false
}
Приведенная ниже функция принимает массив определенного типа
Я хочу ситуацию, когда, если какой-либо элемент в переданном здесь массиве (параметр) существует в enum UserPermissions, я хочу вернуть значение true. возврат true, похоже, не работает в приведенном ниже методе.
const hasAnyPermission = (permissionsPassed: UserPermissions[]) => {
permissionsPassed.map(permission => {
if (hasPermission(permission)) {
return true
}
})
return false
}
Я вызываю hasAnyPermission следующим образом..
hasAnyPermission([Edit,View])
Ответ №1:
Array.prototype.map
возвращает только массив, который вам нужно использовать Array.prototype.some
вместо:
const hasAnyPermission = (permissionsPassed: UserPermissions[]) => {
return permissionsPassed.some(permission => {
if (hasPermission(permission)) {
return true
}
})
}
Что эквивалентно:
const hasAnyPermission = (permissionsPassed: UserPermissions[]) => {
return permissionsPassed.some(permission => hasPermission(permission));
}
Или используйте обычные циклы for-of:
const hasAnyPermission = (permissionsPassed: UserPermissions[]) => {
for(let permission of permissionsPassed) {
if (hasPermission(permission)) {
return true
}
}
return false
}
Комментарии:
1. Да, выберите тот, который вам нравится
Ответ №2:
Сокращенный полностью рабочий пример:
enum UserPermissions { Edit, View, Delete }
const user = { permissions: [UserPermissions.View] }
console.log("has permission?", hasAnyPermission(user, [UserPermissions.Delete]))
function hasAnyPermission(user, permissions: UserPermissions[]) {
if (user?.permissionsEnabled === false) return true
const userHasPermission = (p) => user.permissions.includes(p)
return permissions.some(userHasPermission)
}