0

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

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”的字符串。但是,如果我尝试以其他方式编写相同的代码:

const aLens = prop('a')(stateLens)

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

declare const prop: <A, P extends keyof A>(prop: P) => <S>(sa: Lens<S, A>) => Lens<S, A[P]>

我猜测通过使用管道式打字稿能够以某种方式推断出所有通用参数,而常规prop(...)(...)调用并非如此

4

1 回答 1

1

您尝试的另一种表示法是一个两步过程,首先使用创建一个 lambda 函数prop('a'),然后立即使用...(stateLens). 该prop()函数只接收一个键名“a”,但无法确定它所属的对象,因为它只有字符串参数“a”可以使用。因此,在类型定义中,类型的定义propA被解析为,never因为它没有被分配并且无法推断。

我没有对此进行测试,但是您可能可以通过手动传递类似的类型来做同样的事情

prop<State, 'a'>('a')(stateLens)

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

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

于 2020-10-18T17:26:25.483 回答