2017-05-31 74 views
0

編輯:添加的package.json摘錄分配正確的類型來重新選擇createSelector功能

我想實現在現有的反應項目打字稿,我與Reselect圖書館面臨的困難。 Typescript編譯器堅持導入createSelector函數的第一個定義,並且無法識別我的函數的簽名對應於另一個定義。

定義它導入:

export function createSelector<S, R1, T>(
    selector: Selector<S, R1>, 
    combiner: (res: R1) => T, 
): OutputSelector<S, T, (res: R1) => T>; 

一個我想用:

export function createSelector<S, R1, R2, T>(
    selectors: [Selector<S, R1>, 
       Selector<S, R2>], 
    combiner: (res1: R1, res2: R2) => T, 
): OutputSelector<S, T, (res1: R1, res2: R2) => T>; 

這裏是我的實際代碼:

// groups.selectors.tsx 

import { Selector, createSelector } from 'Reselect'; 
import { IGroup, IQuestionnaire, IGroupReselect, IState } from '../interfaces'; 

const getGroups:Selector<IState, IGroup[]> = state => state.groups; 
const getQuestionnaires:Selector<IState, IQuestionnaire[]> = state => state.questionnaires; 

export const groups = createSelector<IState, IGroup[], IQuestionnaire[], IGroupReselect>(
    [getGroups, getQuestionnaires], 
    (g, q) => { 

    return g.map(group => Object.assign(
     {}, 
     group, 
     {questionnaires: group.questionnairesIds.map(id => q.find(q => q.id === id))} 
    )); 
    } 
); 

而如果是我是任何幫助,這裏是我的ts.config:

{ 
    "compilerOptions": { 
    "module": "es6", 
    "target": "es6", 
    "outDir": ".temp", 
    "allowSyntheticDefaultImports": true, 
    "baseUrl": "src", 
    "noImplicitAny": false, 
    "sourceMap": false, 
    "jsx": "preserve", 
    "strict": true, 
    "moduleResolution": "node" 
    }, 
    "exclude": [ 
    "node_modules" 
    ], 
    "files": [ 
    "typings.d.ts" 
    ] 
} 

我對TypeScript並不完全熟悉,所以在我的實現中肯定有些問題。讓我感到困惑的是,如果我編寫最簡單的重選器,即只有1個選擇器和1個合併器的重選器,它會通過類型檢查,這給我的印象是編譯器沒有在重載函數中正確選擇正確的定義

"dependencies": { 
    "react": "^15.5.4", 
    "react-dom": "^15.5.4", 
    "react-redux": "^5.0.5", 
    "react-router": "^4.1.1", 
    "react-router-dom": "^4.1.1", 
    "redux": "^3.6.0", 
    "redux-devtools-extension": "^2.13.2", 
    "redux-thunk": "^2.2.0", 
    "reselect": "^3.0.1" 
    }, 
    "devDependencies": { 
    "@types/react": "^15.0.25", 
    "@types/react-router-dom": "^4.0.4", 
    "@types/redux-thunk": "^2.1.0", 
    "typescript": "^2.3.3" 
    }, 
+0

我會先檢查一下,看看你有你鏈接到重新選擇的index.d.ts的版本。直到最近才添加對選擇器數組的支持(我認爲是3.0版)。你可以完全省略數組;不需要重新選擇(雖然大多數示例都使用它)。 –

+0

這可能確實是我的依賴版本的問題。至於數組選擇器,我正在運行重新選擇3.0.1,所以它不應該是一個問題。 –

回答

0

我可能是錯的,但是從這個 this issue,它似乎在語言是如何推斷出你的異構陣列[getGroups, getQuestionnaires]作爲造成的:重新選擇的index.d.ts

這裏是我的package.json的相關部分數組而不是元組。

強制的第一個參數元組類型將使其工作,但會引起不必要的樣板

const getGroups:Selector<IState, IGroup[]> = state => state.groups; 
const getQuestionnaires:Selector<IState, IQuestionnaire[]> = state => 
    state.questionnaires; 

const selectors: [Selector<IState, IGroup[]>, Selector<IState, IQuestionnaire[]>] = [getGroups, getQuestionnaires] 

export const groups = createSelector<IState, IGroup[], IQuestionnaire[], IGroupReselect>(
    selectors, 
    (g, q) => { 

    return g.map(group => Object.assign(
     {}, 
     group, 
     {questionnaires: group.questionnairesIds.map(id => q.find(q => q.id === id))} 
    )); 
    } 
); 
+0

此建議不能解決問題。 –