首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lodash流与TypeScript

Lodash流与TypeScript
EN

Stack Overflow用户
提问于 2019-06-21 08:43:47
回答 4查看 9.7K关注 0票数 16

我一直在关注一篇关于Lodash,是个错误的文章,它强调您可以通过使用Flow来消除对链的需求。

给出的示例是以下使用链

代码语言:javascript
复制
import _ from "lodash";

_.chain([1, 2, 3])
    .map(x => [x, x*2])
    .flatten()
    .sort()
    .value();

可以使用流将其转换为

代码语言:javascript
复制
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知道它所处理的是哪种类型?

EN

回答 4

Stack Overflow用户

发布于 2019-06-21 09:03:43

当解释JavaScript / type TypeScript时(注意: typescript代码被转换为JavaScript,然后被解释),当您使用链时,类型记录知道它所处理的类型(即数字数组)。但是,对于flow,流函数要作用的类型是最后指定的,因此它不知道它将使用什么类型,因此需要泛型或者另一种方法来指示将要使用的类型。另外,生成此错误的linter正在解释代码,因此它不知道在使用"flow“时输入最后一次处理的类型。

在使用TypeScript时,使用支持泛型来指定它们所处理的类型的函数。

因此,您可以如下所示,从提交函数中输入/输出什么:

代码语言:javascript
复制
flow(
    map<number, [number, number]>(x => [x, x * 2]),
    flatten,
    sortBy(x => x)
)([1, 2, 3]);

或者正如达雷卡所建议的:

代码语言:javascript
复制
flow(
    map((x: number) => [x, x * 2]),
    flatten,
    sortBy(x => x)
)([1, 2, 3])

但是,这同样有效,因为我们正在向编译器指示要对其进行操作的类型。

可以找到这些代码片段工作的示例这里

注意函数输入/输出是如何显式定义的,例如,"map“表示它将要迭代的类型是一个数字,并且操作的结果是一个元组。

票数 13
EN

Stack Overflow用户

发布于 2019-06-21 11:04:58

_.flow()方法生成一个无尖函数。这样可以防止类型记录推断输入的类型。

要解决这个问题,请将函数赋值给变量,并添加函数的类型。当函数参数和输出被声明时,类型记录可以推断出内部流函数的内部类型。

在将函数赋值给变量之后,您可以调用它(沙坝):

代码语言:javascript
复制
const fn: (numbers: number[]) => number[] = flow(
    map(x => [x, x*2]),
    flatten,
    sortBy(x => x) 
);

const result = fn([1,2,3]);

如果要立即调用函数(沙盒),则使用类型断言:

代码语言:javascript
复制
type Fn = (numbers: number[]) => number[];

const result = (flow(
  map(x => [x, x * 2]),
  flatten,
  sortBy(x => x)
) as Fn)([1, 2, 3]);
票数 8
EN

Stack Overflow用户

发布于 2019-06-21 10:01:00

我喜欢本·史密斯的回答,因为它对我很有教育意义。但我想建议你

代码语言:javascript
复制
map((x: number) => [x, x*2])

甚至是

代码语言:javascript
复制
map((x: any) => [x, x*2])

更一般的案子。它看起来很有效,如果你不想太严格的话,它会得到尽可能多的推论。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56699850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档