首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型预测只在管道函数中起作用。

类型预测只在管道函数中起作用。
EN

Stack Overflow用户
提问于 2020-10-18 17:10:37
回答 1查看 109关注 0票数 0

在我的项目中,我正在使用monocle-ts (https://github.com/gcanti/monocle-ts)库。我有以下代码

代码语言:javascript
复制
import {id, prop} from 'monocle-ts/lib/Lens'
import {pipe} from 'fp-ts/function'

type State = {a: string, b: string}
const stateLens = id<State>()
const aLens = pipe(stateLens, prop('a'))

^此代码工作非常好,类型系统将不允许我传递不是'a‘或'b’的字符串。但是,如果我试图以其他方式编写相同的代码:

代码语言:javascript
复制
const aLens = prop('a')(stateLens)

我收到了一个错误:Argument of type 'string' is not assignable to parameter of type 'never'类型的prop函数定义如下所示:

代码语言:javascript
复制
declare const prop: <A, P extends keyof A>(prop: P) => <S>(sa: Lens<S, A>) => Lens<S, A[P]>

我猜想,通过使用管道样式的类型记录,可以推断出所有的泛型参数,而这不是常规prop(...)(...)调用的情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-18 17:26:25

您尝试过的替代表示法是一个两步的过程,它首先使用prop('a')创建一个lambda函数,然后立即使用...(stateLens)调用它。prop()函数只接收键名'a',但不能确定它所属的对象,因为它只有字符串参数'a‘来处理。因此,在prop的类型定义中,类型A将被解析为never,因为它没有分配,也不能推断。

我没有对此进行测试,但您可能也可以通过手动传递以下类型来做到这一点

代码语言:javascript
复制
prop<State, 'a'>('a')(stateLens)

但这正是pipe从其第一个参数接收State类型时所做的事情,我认为您可以同意在这种情况下使用pipe看起来更好。

所以,您是对的,pipe能够推断出正确的类型并将其传递给prop

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

https://stackoverflow.com/questions/64416082

复制
相关文章

相似问题

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