Типа безопасный способ переключения между всеми перестановками нескольких переменных?Javascript

Форум по Javascript
Ответить
Anonymous
 Типа безопасный способ переключения между всеми перестановками нескольких переменных?

Сообщение Anonymous »

Предположим, у меня есть функция, которая генерирует строку на основе состояния двух логических значений:




true
false




"a"
"Сообщение A"
"Сообщение B"


"b"
"Сообщение C"
null



Прямая реализация этого может выглядеть так;

Код: Выделить всё

function createMessageBasedOnConditions(conditionA: boolean, conditionB: "a" | "b") : string | null {

if(conditionA && conditionB === "a") {
return "Message A";
}

if(!conditionA && conditionB === "a") {
return "Message B"
}

if(conditionA && conditionB === "b") {
return "Message C";
}

// TypeScript has not narrowed the types at this point.
//(parameter) conditionA: boolean
conditionA

//(parameter) conditionB: "a" | "b"
conditionB

return null;

}

Но это трудно читать, и IMO подвержен ошибкам.
Лучшая реализация может выглядеть так:

Код: Выделить всё

function assertUnreachable(values: never): never {
throw new Error("Didn't expect to get here");
}

function createMessageBasedOnConditions(conditionA: boolean, conditionB: "a" | "b") : string | null {

if(conditionA) {
if(conditionB === "a") {
return "Message A";
}
else if (conditionB ==="b"){
return "Message C"
}

return assertUnreachable(conditionB);

}
else {
if (conditionB === "a") {
return "Message B"
}
else if(conditionB==="b") {

// (parameter) conditionA: false
conditionA
//(parameter) conditionB: "b"
conditionB
return null;
}

return assertUnreachable(conditionB);

}

//Unreachable code detected.(7027)

conditionA
conditionB

}

Здесь, по крайней мере, мы подробно описываем сценарий, в котором мы возвращаем значение null, мы не возвращаем его случайно в случае, если мы не проверяли условие.
Но это становится довольно громоздким, если мы начинаем говорить о большем количестве перестановок, нам нужно добавить блоки обработки в каждый блок верхнего уровня.
Мне приходит в голову, что на самом деле мне нужен какой-то оператор переключения который может работать с несколькими переменными, например

Код: Выделить всё

function assertUnreachable(values: Array): never {
throw new Error("Didn't expect to get here");
}

function createMessageBasedOnConditions(conditionA: boolean, conditionB: boolean) : string | null {
// Imaginary syntax follows
switch(conditionA, conditionB) {
case true, true: {
return "Message A";
}
case true, false: {
return "Message C";
}
case false, true: {
return "Message B";
}

case false, false {
return null;
}

default: {
assertUnreachable([conditionA, conditionB]);
}
}
}
Думаю, технически мы на самом деле ничего не упростили — нам все равно нужно перечислять все перестановки и обрабатывать их соответствующим образом.
Но главное преимущество этого, на мой взгляд, заключается в том, что по умолчанию определенно будет обрабатываться все необработанные случаи в одном утверждении AssertUnreachable.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -variables
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»