据我所知。重新选择的Ts文件(https://github.com/reactjs/reselect)是正确的。那么这里发生了什么……是Typescript编译器的问题吗?我的tsconfig吗?
重现问题:
Demo.ts
import { createSelector, Selector } from 'reselect';
export interface DemoState {
values: {
value1: number,
value2: number
},
}
export const selectTotal = createSelector<DemoState, number, number, number>(
state => state.values.value1,
state => state.values.value2,
(value1, value2) => {
return value1 + value2;
}
);
从reselect.d.ts中可以看出,上面的createSelector()
应该返回类型Selector<DemoState, number>
:
reselect.d.ts
function createSelector<TInput, TOutput, T1, T2>(selector1: Selector<TInput, T1>, selector2: Selector<TInput, T2>, combiner: (arg1: T1, arg2: T2) => TOutput): Selector<TInput, TOutput>;
type Selector<TInput, TOutput> = (state: TInput, props?: any) => TOutput;
然而,typescript编译器实际为定义生成的是:
Demo.d.ts
export declare const selectTotal: Selector<DemoState, number, number, number>;
秀……当我在另一个项目中导入selectTotal
时,我得到错误:"通用类型'选择器'需要2个类型参数。"因为reselection .d.ts只定义了Selector<TInput, TOutput>
,而据我所知,这就是createSelector
应该返回的,而不管传递给它的类型参数的数量。
我可以得到正确的定义生成的唯一方法是通过显式转换createSelector
的结果,但我不认为我应该这样做…
export const selectTotal = createSelector<DemoState, number, number, number>(
state => state.values.value1,
state => state.values.value2,
(value1, value2) => {
return value1 + value2;
}) as Selector<DemoState, number>;
使用TypeScript 2.0.3,和我的tsconfig,如果它是相关的:
{
"compileOnSave": true,
"compilerOptions": {
"rootDir": "./src",
"outDir": "./dist",
"declaration": true,
"sourceMap": true,
"target": "es6",
"module": "es6",
"moduleResolution": "node",
"jsx": "preserve",
"allowSyntheticDefaultImports": true,
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true,
"removeComments": false,
"preserveConstEnums": true
},
"exclude": [
"node_modules",
"dist"
]
}
原来这是TypeScript 2.0.3编译器的一个问题。升级到2.0.6+解决了这个问题。
https://github.com/Microsoft/TypeScript/issues/12370