@ ngrx / reducer:createReducer()和on()是否不是类型安全的?

时间:2019-10-09 16:40:30

标签: angular ngrx

在使用我未使用过的 @Override public void onFinished(File file) { String fileName = file.getName(); System.out.println("Finished file: " + file); video_file = file; emitter.complete(); response.addHeader("Content-Disposition", "attachment; filename="+ fileName); try { response.setHeader("Content-Disposition", String.format("inline; filename=\"" + file.getName() +"\"")); response.setContentLength((int)file.length()); InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); FileCopyUtils.copy(inputStream, response.getOutputStream()); } catch (IOException ex) { ex.printStackTrace(); } } 的早期版本时 ngrxcreateAction(),如果我尝试添加不属于提供的createReducer()的任何其他属性,则会抛出错误。

我将应用程序升级到State,并且也使用了Angular 8。现在,即使ngrx 8.3.0文档指出将实现大多数类型推断,似乎类型安全性已不复存在。

NGRX

someState.ts

export interface ISampleState { id: number }

someAction.ts

export const request = createAction('[SAMPLE] Request', props<{id: number}>();

someReducer.ts

在实际运行代码之后,我将通过const initialState: ISampleState = { id: null } const sampleReducer = createReducer( initialState, on(SampleActions.request, (state, { id }) => { return { ...state, id, // Below would previously complain since only `id` is defined in the `ISampleState` thisShouldNormallyComplain: 'but it does not' } } ); // AOT purposes export function reducer(state: ISampleState | undefined, action: Action): ISampleState { return sampleReducer(state, action); } 看到商店确实填充了此不必要的属性。

我最大的担心是,当我在DevTools块内的减速器中遇到错字时,它也不会抱怨。

即如果我不小心输入

return

很难找到错误,因为它可以很好地编译而不会产生投诉。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

已经玩了一点,看来这是TypeScript的问题! createReducer最终创建一个签名为ActionReducer<S, A>的{​​{1}}。

在这种情况下,即使返回的类型比(state: S | undefined, action: A) => S具有更多的属性,TypeScript似乎也允许满足该签名的任何可调用函数满足该参数。我向编译器提出了this bug,因为在我看来这不是正确的行为。