RawObjectDataProcessor — Типовые сценарии
Объекты фиксированной структуры
Обязательность свойств
В случае ECMAScript, понятие обязательности (requirement) свойств расплывчато ввиду наличия двух пустых типов — undefined и null, причём отсутствие какого-либо свойства или элемента в целом не равносильно его наличию со явно указанным undefined в качестве значения. Что значит «свойство обязательно»? Оно не должно иметь значения undefined или null? А может, ни того, не другого?
До версии 1.8 библиотеки YDEE, в спецификации свойств объектных данных required: true означал запрет на undefined, но не на] null — по умолчанию null был запрещён, а снять этот запрет можно было указав nullable: true. Может быть, такой программный интерфейс и лаконичный, но не слишком интуитивный, а это — множественные трещины в поддерживаемости кода.
Начиная с версии 1.8, разрешения/запреты на undefined и на null необходимо указывать явно и отдельно, но единообразным способом:
| Разрешение/запрет | Случай с undefined | Случай с null |
|---|---|---|
| Полный запрет | isUndefinedForbidden: true | isNullForbidden: true |
| Условный запрет | undefinedForbiddenIf: ConditionAssociatedWithProperty | nullForbiddenIf: ConditionAssociatedWithProperty |
| Подстановка значения по умолчанию | undefinedValueSubstitution: NonEmptyValue | nullValueSubstitution: NonEmptyValue |
| Трансформация в другой пустой тип | mustTransformUndefinedToNull: true | mustTransformNullToUndefined: true |
| Полное разрешение | isUndefinedForbidden: false | isNullForbidden: false |
Также, если isUndefinedForbidden/isNullForbidden указано значение false (полное разрешение), то можно дополнительно через mustBeUndefinedIf/mustBeNullIf соответственно указать, когда значение должно быть пустым.
Полный запрет пустых значений
- Укажите
isUndefinedForbidden: true, чтобы запретить свойства со значениямиundefined, будь то явный undefined или просто отсутствие свойства. - Укажите
isNullForbidden: trueчтобы запретить свойства со значениемnull.
type ValidData = { alpha: number; };
const validDataSpecification: RawObjectDataProcessor.ObjectDataSpecification = {
nameForLogging: "ValidData",
subtype: RawObjectDataProcessor.ObjectSubtypes.fixedSchema,
properties: {
alpha: {
type: Number,
numbersSet: RawObjectDataProcessor.NumbersSets.anyRealNumber,
isUndefinedForbidden: true,
isNullForbidden: true
}
}
};alpha, которое может иметь только числовые значения, но никакие другие, в частности undefined и null не допускаются ни при каких условиях.const processingResult: RawObjectDataProcessor.ProcessingResult<ValidData> = RawObjectDataProcessor.
process({}, validDataSpecification);alpha. Это не эквивалентно тому, что был бы явно указан undefined, тем не менее если бы мы попробовали обратиться к свойству alpha у исходного объекта, то возвращённым значением было бы undefined, а это не допускается запретом isUndefinedForbidden: true.const processingResult: RawObjectDataProcessor.ProcessingResult<ValidData> = RawObjectDataProcessor.
process({ alpha: underfined }, validDataSpecification);alpha хотя и указано, но указанным значением является явный undefined, что также не удовлетворяет ограничению isUndefinedForbidden: true.const processingResult: RawObjectDataProcessor.ProcessingResult<ValidData> = RawObjectDataProcessor.
process({ alpha: 7 }, validDataSpecification);alpha является число, что соответствует установленным ограничениям для данного свойства.