Почему дискриминируемые союзы в typescript не работают таким образом?

#typescript

#typescript

Вопрос:

Почему typescript не может различать на основе такого общего свойства, как это? После прочтения документов я подумал, что это сработает.

Вот игровая площадка для typescript

 type Mammal = { legs: number }
type Fish = { fins: number }

type Action1 = {
    type: 'a',
    payload: Mammal 
}


type Action2 = {
    type: 'b',
    payload: Fish
}

type ActionUnion = Action1 | Action2

const A: Action1 = { type: 'a', payload: { legs: 4 } }
const B: Action2 = { type: 'b', payload: { fins: 3 } }

function foo(action: ActionUnion) {
    switch (action.type) {
        case 'a':
            const { legs } = action.payload

        case 'b':
            const { fins } = action.payload

        default:
            break
    } 
}
  

Ответ №1:

Вы забыли разбить оператор case. Должно выглядеть так

 case 'a':
    const { legs } = action.payload
    break;
case 'b':
    const { fins } = action.payload
  

Комментарии:

1. Массивная лицевая ладонь.

2. @hally9k Уже полночь. Вы прощены.

Ответ №2:

Они действительно работают так, но ваш случай переключения переходил к следующему случаю, добавьте a break , и он будет работать

 type Mammal = { legs: number }
type Fish = { fins: number }

type Action1 = {
    type: 'a',
    payload: Mammal 
}


type Action2 = {
    type: 'b',
    payload: Fish
}

type ActionUnion = Action1 | Action2

const A: Action1 = { type: 'a', payload: { legs: 4 } }
const B: Action2 = { type: 'b', payload: { fins: 3 } }

function foo(action: ActionUnion) {
    switch (action.type) {
        case 'a':
            const { legs } = action.payload
            break;
        case 'b':
            const { fins } = action.payload
            break;
        default:
            break
    } 
}