0

据我所知,重新选择的 .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"
  ]
}
4

1 回答 1

1

原来这是 TypeScript 2.0.3 编译器的问题。升级到 2.0.6+ 解决了这个问题。

https://github.com/Microsoft/TypeScript/issues/12370

于 2016-11-19T15:37:26.603 回答