据我所知,重新选择的 .d.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()
上面应该返回 type Selector<DemoState, number>
:
重新选择.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;
但是,打字稿编译器实际为定义生成的是:
演示.d.ts
export declare const selectTotal: Selector<DemoState, number, number, number>;
Soo...当我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"
]
}