我一直在关注一篇关于Lodash,是个错误的文章,它强调您可以通过使用Flow来消除对链的需求。
给出的示例是以下使用链
import _ from "lodash";
_.chain([1, 2, 3])
.map(x => [x, x*2])
.flatten()
.sort()
.value();可以使用流将其转换为
import map from "lodash/fp/map";
import flatten from "lodash/fp/flatten";
import sortBy from "lodash/fp/sortBy";
import flow from "lodash/fp/flow";
flow(
map(x => [x, x*2]),
flatten,
sortBy(x => x)
)([1,2,3]);然而,当我使用TypeScript实现这一点时,我会得到以下错误
对象的类型为“未知”..ts(2571)

有没有办法解决这个问题,以便TypeScript知道它所处理的是哪种类型?
发布于 2019-06-21 09:03:43
当解释JavaScript / type TypeScript时(注意: typescript代码被转换为JavaScript,然后被解释),当您使用链时,类型记录知道它所处理的类型(即数字数组)。但是,对于flow,流函数要作用的类型是最后指定的,因此它不知道它将使用什么类型,因此需要泛型或者另一种方法来指示将要使用的类型。另外,生成此错误的linter正在解释代码,因此它不知道在使用"flow“时输入最后一次处理的类型。
在使用TypeScript时,使用支持泛型来指定它们所处理的类型的函数。
因此,您可以如下所示,从提交函数中输入/输出什么:
flow(
map<number, [number, number]>(x => [x, x * 2]),
flatten,
sortBy(x => x)
)([1, 2, 3]);或者正如达雷卡所建议的:
flow(
map((x: number) => [x, x * 2]),
flatten,
sortBy(x => x)
)([1, 2, 3])但是,这同样有效,因为我们正在向编译器指示要对其进行操作的类型。
可以找到这些代码片段工作的示例这里。
注意函数输入/输出是如何显式定义的,例如,"map“表示它将要迭代的类型是一个数字,并且操作的结果是一个元组。
发布于 2019-06-21 11:04:58
_.flow()方法生成一个无尖函数。这样可以防止类型记录推断输入的类型。
要解决这个问题,请将函数赋值给变量,并添加函数的类型。当函数参数和输出被声明时,类型记录可以推断出内部流函数的内部类型。
在将函数赋值给变量之后,您可以调用它(沙坝):
const fn: (numbers: number[]) => number[] = flow(
map(x => [x, x*2]),
flatten,
sortBy(x => x)
);
const result = fn([1,2,3]);如果要立即调用函数(沙盒),则使用类型断言:
type Fn = (numbers: number[]) => number[];
const result = (flow(
map(x => [x, x * 2]),
flatten,
sortBy(x => x)
) as Fn)([1, 2, 3]);发布于 2019-06-21 10:01:00
我喜欢本·史密斯的回答,因为它对我很有教育意义。但我想建议你
map((x: number) => [x, x*2])甚至是
map((x: any) => [x, x*2])更一般的案子。它看起来很有效,如果你不想太严格的话,它会得到尽可能多的推论。
https://stackoverflow.com/questions/56699850
复制相似问题