代码之家  ›  专栏  ›  技术社区  ›  samneric

带有两个类型参数的NGRX CreateFeatureSelector

  •  2
  • samneric  · 技术社区  · 7 年前

    我正在学习NGRX,目前正在使用V6.0.1和Angularcli V6.0.8。

    示例应用程序演示如何使用以下两个类型参数创建根级别的CreateFeatureSelector:

    example-app/app/reducers/index.ts
    
    .....
    
    export const getLayoutState = createFeatureSelector<State, fromLayout.State>(
      'layout'
    );
    

    当我试图在我的应用程序中重现这个示例时,编译器抱怨CreateFeatureSelector需要1个参数,但我提供了2个。

    我一直在调查和发现,当我通过在应用程序中导入的createFeatureSelector函数上按F12在vscode中导航时,它将带我到下面显示的行:

    selector.d.ts
    .....
    
    export declare function createSelectorFactory<T = any, V = any>(memoize: MemoizeFn): (...input: any[]) => Selector<T, V>;
    export declare function createSelectorFactory<T = any, V = any>(memoize: MemoizeFn, options: SelectorFactoryConfig<T, V>): (...input: any[]) => Selector<T, V>;
    export declare function createFeatureSelector<T>(featureName: string): MemoizedSelector<object, T>;
    /\/\/\
    

    selector.d.ts文件中没有其他导出的功能。

    但是,当我下载了NGRX平台repo并在同一条线上导航时,我最终在这条线上:

    selector.ts
    .....
    
    export function createFeatureSelector<T>(
      featureName: string
    ): MemoizedSelector<object, T>;
    export function createFeatureSelector<T, V>(
      featureName: keyof T
    ): MemoizedSelector<T, V>;
    /\/\/\/\/\
    export function createFeatureSelector(
      featureName: any
    ): MemoizedSelector<any, any> {
      return createSelector(
        (state: any) => state[featureName],
        (featureState: any) => featureState
      );
    }
    

    这看起来更准确,因为签名包含两个类型参数。

    当我将@ngrx/store添加到package.json中时,我在哪里得到错误版本的时候做了什么错误?这是一个示例:

    ....
    "moment": "2.22.2",
    "npm": "^6.1.0",
    "@ngrx/effects": "6.0.1",
    "@ngrx/router-store": "6.0.1",
    "@ngrx/store": "6.0.1",
    "@ngrx/store-devtools": "6.0.1",
    "ngrx-store-freeze": "0.2.4",
    "primeng": "^5.2.7",
    "rxjs": "6.2.1",
    ....
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   timdeschryver    7 年前

    这是一个未发布的功能,将在下一个版本中提供。
    您现在可以使用下面的代码。

    export const getLayoutState = createFeatureSelector<fromLayout.State>('layout');
    
        2
  •  0
  •   fastAsTortoise    7 年前

    您只需要为要为其创建选择器的状态传递接口,如下所示:

    export interface LayoutState {
      layout: fromLayout.State;
      somethingElse: fromsomethingElse.State;
      ...: .....;
    }
    
    export const getLayoutState = createFeatureSelector<LayoutState>('layout')

    布局状态只是一个更好地输入和帮助IDE的界面。

        3
  •  0
  •   samneric    7 年前
    • 编辑-由NGRX开发者Tim接受的答案解决。

    我已经为我的问题在ngrx repo上创建了一个bug,并将在此处随进度更新。

    https://github.com/ngrx/platform/issues/1191