gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:49:32 25 4
gpt4 key购买 nike

据我所知,用于重新选择的 .d.ts 文件 ( https://github.com/reactjs/reselect ) 是正确的。那么这是怎么回事……是 Typescript 编译器的问题吗?我的 tsconfig?

要重现该问题:

演示.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> :

重新选择.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 编译器实际生成的定义是:

演示.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"
]
}

最佳答案

事实证明这是 TypeScript 2.0.3 编译器的问题。升级到 2.0.6+ 可以解决该问题。

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

关于javascript - Typescript 编译器为 Reselect.createSelector() 生成错误的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40208012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com