2016-09-21 2 views
0

Как оценивать состояние в режиме короткого замыкания в машинописном тексте? TypScript не разрешает & или | для булевого типа. Причина, по которой мне нужна проверка не короткого замыкания, я вызываю showErrors в функции isValueValid.Как сделать условие короткого замыкания в Typcript?

Учитывая эту функцию

function isValue1Valid(){ 
    if(value1 === 0) return true;  
    showErrors1(); 
    return false; 
} 

function isValue2Valid(){ 
    if(value2 === 0) return true;  
    showErrors2(); 
    return false; 
} 

Тогда в моем состоянии

if(isValue2Valid() & isValue2Valid()){ 
//Submit data 
} 

Хотя я могу это сделать как этот

if(isValue2Valid() & isValue2Valid()){ 
//Submit data 
    return; 
} 
showErrors1() 
showErrors2() 

Но я чувствую, чтобы назвать его внутри естьV alueValid функция. На самом деле я всегда думаю, что при вызове show error по умолчанию всегда возникает ошибка.

+7

Чтобы избежать «XY» Проблема: почему вы хотите, чтобы не короткое замыкание? (Я подозреваю, что вы зависите от побочных эффектов ... если так извлечь их из условного выражения.) – Richard

+0

Действительно ли это как проблема XY. Если бы я смотрел на программирование, когда думал, что буду умным и что-то вроде 'if (process (otherStuff) && valid (stuff)), только чтобы понять, что он не работает, если я заменил условия. – vlaz

+0

Я вызываю некоторую функцию внутри чего-то 'valid1() & valid2()'. – janmvtrinidad

ответ

2

Чтобы ответить на ваш вопрос , вы можете сделать

if ([isValue2Valid(), isValue2Valid()].every(Boolean)) { 
    //Submit data 
} 

, чтобы оценить все вызовы функций, а затем объединить их значения. Но вы действительно не должны были isValueValid позвонить showError в первую очередь. Вместо этого сделать ваши функции тестирования return сообщения об ошибках, а затем, если таковые имеются, показать им:

function getValue1Error() { 
    if (value1 === 0) return null; 
    else return "error1"; 
} 

function getValue2Error() { 
    if (value2 === 0) return null; 
    else return "error2"; 
} 

// then: 
const errors = [getValue1Error(), getValue2Error()] // or even better, just a loop over your fields 
if (errors.some(Boolean)) { 
    for (let error of errors) 
     showError(error); 
} else { 
    // Submit data 
} 
+0

Я закончил делать это как в вашей последней части кода. Спасибо @Bergi – janmvtrinidad

1

Если вы хотите использовать функции с побочными эффектами (что не является хорошей идеей в целом), это может помочь быть очень четко о том, что называется, и когда:

var value1Valid = isValue1Valid(); // might show some messages 
    var value2Valid = isValue2Valid(); // might show some more messages 

    if (value1Valid && value2Valid) { 
     // submit data 
    }