Typescript编译器为Reselect.createSelector()生成了错误的返回类型



据我所知。重新选择的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

相关内容

最新更新