在下面的示例中,我们有:
- 类型:
Either<RangedNumberValueFailuresAbstract<int>, int>
- 如果没有错误:
right(number)
- 如果错误:
left(RangedNumberValueFailuresAbstract.invalidNumber(failedNumberValue: number))
如果我们需要访问 (failedNumberValue: number) 中的 failedNumberValue,我们该怎么做呢?
示例:
@immutable
class RangedNumberValueObjectLibrary extends ValueObjectAbstract {
factory RangedNumberValueObjectLibrary({@required int number}) {
var validatedNumber = RangedNumberValueValidationLibrary.validate(number: number);
return RangedNumberValueObjectLibrary._(value: validatedNumber);
}
@protected
RangedNumberValueObjectLibrary._({@required value}) : super.private(value: value);
}
@immutable
class RangedNumberValueValidationLibrary extends ValueValidationAbstract {
@protected
static const _minimum = 2;
@protected
static const _maximum = 4;
static Either<RangedNumberValueFailuresAbstract<int>, int> validate({@required int number}) => _minimum <= number && number <= _maximum ? right(number) : left(RangedNumberValueFailuresAbstract.invalidNumber(failedNumberValue: number));
}
上面使用了以下使用 Freezed 包的抽象类。
@freezed
@immutable
abstract class RangedNumberValueFailuresAbstract<T> extends ValueFailuresAbstract with _$RangedNumberValueFailuresAbstract<T> {
const factory RangedNumberValueFailuresAbstract.invalidNumber({@required T failedNumberValue}) = InvalidNumber<T>;
}