Начиная с 4.0, CASL поддерживает классы как предметы. Из-за этого detectSubjectType
вызывается для каждого правила во время создания Ability
, чтобы определить тип объекта.
В вашем случае функция обрабатывает только переданные объекты как объекты (с полем subject
), но она также должна корректно работать со строками.
У вас есть 2 варианта:
- проверить, является ли тема строкой, и если да, вернуть ее, поскольку
const ability = new Ability([{ action: 'read', subject: 'article' }], {
detectSubjectType: subject => typeof subject === 'string' ? subject : subject.subject
})
- use по умолчанию
detectSubjectType
как запасной вариант
import { Ability, detectSubjectType } from '@casl/ability';
const ability = new Ability([{ action: 'read', subject: 'article' }], {
detectSubjectType: subject => subject && subject.subject ? subject.subject : detectSubjectType(subject)
})
В разделе Обнаружение пользовательского типа объекта , в документах говорится:
Пользовательская функция обнаружения должна возвращать string
и обрабатывать следующие случаи:
- , когда
subject
равно undefined
- , когда
subject
равно string
или function
(это следует воспринимать как субъект введите) - , когда субъект является
object
Если вы не хотите обрабатывать все эти случаи, вы можете вернуться к встроенной функции detectSubjectType
, которая будет делать это для тебя.