据我所知,用于重新选择(https://github.com/reactjs/reselect)的.d.ts文件是正确的。所以这里发生了什么.这是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个类型参数。”因为reselect.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"
]
}发布于 2016-11-19 23:37:27
原来这是TypeScript 2.0.3编译器的一个问题。升级到2.0.6+可以解决此问题。
https://stackoverflow.com/questions/40208012
复制相似问题