2017-04-14 2 views
1

내 앵귤러 2에서는 ngrx를 사용하고 일부 액션과 리듀서가 있습니다. 행동의 예 : - 아니, 및 ActionsActionOne 또는 ActionTwo 수 있습니다 조합 유형입니다Typescript v2.2.2 union type 오류 (TS2339)

import { Action } from '@ngrx/store'; 

export const actionTypes = { 
    ACTION_1: type('Actions 1'), 
    ACTION_2: type('Actions 2'), 
}; 

export class ActionOne implements Action { 
    public type = actionTypes.ACTION_1; 

    constructor(public payload: any) { } 
} 

export class ActionTwo implements Action { 
    public type = actionTypes.ACTION_2; 
} 

export type Actions 
    = ActionOne 
    | ActionTwo; 

그래서, 일부 작업은 페이로드, 다른 사람이있다. 그러나 나 감속기에서 나는 오류가 있습니다 Property 'payload' does not exist on type 'Actions' Property 'payload' does not exist on type 'ActionTwo'.

감속기는 다음과 같이이다 : 나는 2.0.3에서 2.2.2에 타이프 라이터 버전을 업데이트 한 후이 오류가 발생했습니다

export function reducer(state = initialState, action: Actions): IState { 
    switch (action.type) { 

    case actions.actionTypes.ACTION_1: { 
     return Object.assign({}, state, { 
     data: action.payload, 
     }); 
    } 

    case ... 
    } 
} 

. 그래서 모든 작업에 페이로드를 두지 않고 오류를 수정하는 방법이 있습니까? 이 경우에 tsconfog.json의 옵션이있을 수 있습니까? 컴파일러는 권리만을 공유 속성을 가진 유형의 조합 결과로 분명히

case actions.actionTypes.ACTION_1: { 
    return Object.assign({}, state, { 
     data: (action as ActionOne).payload, 
    }); 
} 

및 :

답변

1

사전 대신 사전을 네임 스페이스에 선언 할 수 있습니다. 이것은 ACTION_1과 ACTION_2가 구분 된 노동 조합이 작동하는 데 필수적인 리터럴 유형을 취하는 것을 허용합니다. 각 class 요구

export namespace actionTypes { 
    export const ACTION_1 = 'Action 1'; // <-- type of ACTION_1 is 'Action 1' in TS 2.1+ 
    export const ACTION_2 = 'Action 2'; 
}; 

type 그렇지 않으면 type의 유형 대신 문자 유형의 string 것, 일정한 수있다.

export class ActionOne implements Action { 
    public readonly type = actionTypes.ACTION_1; // <-- note the `readonly` 
    constructor(public payload: any) { } 
} 

export class ActionTwo implements Action { 
    public readonly type = actionTypes.ACTION_2; 
} 

ACTION_ONE: type('Action one') 패턴

정보에 대한 https://github.com/ngrx/example-app/pull/88#issuecomment-272623083를 참조 각도 타이프 2.1/4. 이후 ngrx 개발자가 사용되지 않습니다.

+0

'type()'은 typescript가 아니며, ngrx의 util 함수입니다. –

+0

@qweasd 업데이트를 확인하십시오. – kennytm

-2

당신은 그래서 당신은 적절한 하나에 캐스트 할 수 있습니다 그것이 행동이 스위치 케이스 내부에 알 payload은 그들 중 하나가 아닙니다.

+0

사람들이 왜 대답을 좋아하지 않는지 궁금합니다. 문제를 해결하고 오히려 쉽게 해결합니다. –

관련 문제