【发布时间】:2020-03-17 08:51:28
【问题描述】:
如果我有一个Maybe<int>[],并且我只想获取不是None 的数组值,那么最好的方法是什么,并让 typescript 了解它得到了什么?
我假设输入的方式是说我最终会输入int[]。
我能做到:
const x: int[] = [1, 2, 3, null]
.map(Maybe.fromNull)
.filter(x => !x.isNone())
.map(x => x.getOrElse(-1)) // this ought not to ever require the default value
但这感觉非常笨拙和冗长。我觉得我错过了一些更好的处理方式。
【问题讨论】:
-
不确定有没有办法使用原生数组方法来做到这一点。数组类型(更抽象)
Array<A | B>但当您调用.filter()删除所有As 时,类型不会改变,因为.filter()返回相同类型的数组。仅对于 TS,您可以使用类型断言,但在您的情况下,数组实际上包含具体对象。所有Maybes 不能只知道它们不是空的。至少可以说这是一个棘手的问题。 -
顺便说一句,即使在 JS/TS 之外,您也会遇到类似的问题 - 当您尝试使用流/LINQ 操作时,我已经在 Java 和 C# 中看到过,类型无法真正知道是什么到那时为止已经在链中完成了。您可以执行
.filter(x => x.id != null)并且后面的操作无法知道id始终已设置 - 如果您尝试取消引用.id就像不为空一样,它们会警告您。 -
null和Maybe标记的联合有什么区别?对于后者,您不必检查None值,因为涉及的代码总是考虑这两种情况。这适用直到您折叠或消除标记的联合,就像您对getOrElse所做的那样。给定的示例未按预期使用Maybe。 -
@bob 对于我正在使用的代码,当我与一些需要
int[]的代码进行交互时,就会出现问题,例如;在这种情况下,我很乐意从列表中删除任何不包含值的内容 -
@VLAZ 我完全同意;
filter改变类型真的没有意义。我将更多地解决这个问题,看看我能想出什么,作为记录,我遇到的实际问题是尝试在前端使用关系数据结构;对象通过 Ids 与其他对象相关,但并不能真正保证具有给定 id 的对象存在,这就是为什么我在这里开始使用也许
标签: typescript functional-programming monetjs