Я работаю с API, который возвращает схему для проверки формы, прежде чем пользователи смогут отправлять свои данные.
Например, схема имеет класс User
с атрибутом, называемым email
. Если произошла ошибка, User.validators.getEmailErrors()
возвращает Array
всех ошибок, например ['Email address cannot be blank', 'Email addresses must match']
.
Однако, если поле действительно и ошибки не найдены, getEmailErrors()
возвращает значение null
.
В моем приложении я хочу безопасно getEmailErrors().join(',')
несколько методов из getEmailErrors()
, например getEmailErrors().join(',')
, но без предварительной проверки null
. Скорее, существует ли способ, например, с использованием прокси ES6, чтобы getEmailAddress()
знал, вернет ли он Array
и безопасно будет игнорировать любые методы, такие как join()
если он вернет null
?
Легким решением было бы вернуть пустой Array
в действительном случае вместо null
, но предположим, что я не могу его изменить.
Это можно сделать косвенно.
Следующий код был создан из ЗДЕСЬ, и я добавляю код для тестирования.
Спасибо за оригинального автора, Djamel Hassaine.
{
class test {
constructor () {
this.in = 0;
}
sum ( a, b ) {
this.in += a + b;
return this;
}
}
let k = new test();
function traceMethodCalls(obj) {
const handler = {
get(target, propKey, receiver) {
console.log( target, propKey, receiver );
console.log( this );
console.log( handler === this );
const targetValue = Reflect.get(target, propKey, receiver);
if (typeof targetValue === 'function') {
return function (...args) {
console.log('CALL', propKey, args);
console.log( this );
console.log( this === receiver );
return targetValue.apply(this, args); // (A)
}
} else {
return targetValue;
}
}
};
return new Proxy(obj, handler);
}
let l = traceMethodCalls( k );
console.log( l.sum( 1, 2 ) );
console.log( l );
console.log( l.sum( 1, 2 ) );
console.log( l );
}
По-другому:
User.validators.getEmailErrorsOriginal = User.validators.getEmailErrors
User.validators.getEmailErrors = function ( ...args ) {
return ( this.getEmailErrorsOriginal( ...args ) || [] );
}
(getEmailErrors() || []).join(',')
Это то, что вы ищете? Это не очень чистое, но, конечно, короткое...
(getEmailErrors() || []).join(',')
?