【问题标题】:Typescript compiler generating wrong return type for Reselect.createSelector()Typescript 编译器为 Reselect.createSelector() 生成错误的返回类型
【发布时间】:2017-03-05 14:47:49
【问题描述】:

据我所知,重新选择的 .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() 应该返回类型 Selector&lt;DemoState, number&gt;

重新选择.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;

然而,打字稿编译器实际为定义生成的是:

Demo.d.ts

export declare const selectTotal: Selector<DemoState, number, number, number>;

Soo...当我在另一个项目中导入 selectTotal 时,我收到错误消息:“通用类型‘选择器’需要 2 个类型参数。”因为 reselect.d.ts 只定义了 Selector&lt;TInput, TOutput&gt;,据我所知,这就是 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"
  ]
}

【问题讨论】:

    标签: javascript reactjs typescript react-native reselect


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 2020-07-29
      • 2018-08-12
      • 2017-11-21
      • 1970-01-01
      相关资源
      最近更新 更多