【发布时间】:2018-03-18 18:46:26
【问题描述】:
我正在尝试找出 Ramda 食谱方法 mapKeys 的正确类型是什么,它不会在不抛出错误的情况下进行转换。
问题
fn 出现错误:
'{}' 类型的参数不能分配给 '(a: 字符串)=> 字符串'。类型“{}”不匹配签名“(a: 字符串):字符串'。
我可以从R.adjust 的类型中看到它使用泛型,我根据错误尝试了(a: string) => string,这应该是正确的类型,以及其他几个变体,例如(a: string) => string[]。
有人能指出匿名函数的fn 参数应该是什么来修复打字错误吗?
这真的很容易复制,只需使用 VSCode 将示例粘贴到 TypeScript 项目中并通过 npm 安装 Ramda,我将 R.adjust 的类型作为参考。
示例
import * as R from 'ramda';
export const mapKeys = R.curry(
(fn: ???, obj: { [k: string]: any } | { [k: number]: any }) =>
R.fromPairs(
R.map(
R.adjust(fn, 0), // <--- Error: tried typings for `adjust`
R.toPairs(obj)
)
)
);
Ramda 类型供参考
adjust<T>(fn: (a: T) => T, index: number, list: T[]): T[];
adjust<T>(fn: (a: T) => T, index: number): (list: T[]) => T[];
【问题讨论】:
-
我不知道打字稿。但是该函数应该具有接受单个字符串并返回字符串的类型。
-
我猜它理论上可以具有与
toPairs相同的String || Number类型,尤其是在返回时,但这可能是矫枉过正。 (谁会那样使用它?) -
@ScottSauyet 是的,当我看到错误时我也是这么想的,但我已经尝试了错误消息
(a: string) => string和string中提供的内容。我认为这可能是adjust类型的问题......因为 Ramda 食谱renameBy中使用adjust的另一种方法也有同样的问题 -
恐怕我出局了。没有关于 TS 如何真正运作的想法。但祝你好运。
标签: typescript typescript-typings ramda.js