javascript - 带有 Lodash 的 TypeScript : _. map( ["123", "234 "], _.trim) 返回 boolean[]?

标签 javascript arrays typescript lodash

我有一个像这样拆分的字符串数组:

var searchValue = "600-800, 123, 180";
var groups = searchValue.split(","); // => ["600-800", " 123", " 180"]

(所以项目周围可能有空白)我想删除空白。我知道我可以将 Array.prototype.mapString.prototype.trim 一起使用,但我想要一个专门使用 Lodash 的解决方案。

According to the docs ,我应该可以说:_.map(['foo', 'bar'], _.trim); 它会返回 ['foo', 'bar'] ,这是一个 string[]

但是,TypeScript 对我咆哮。这是我在编辑器中看到的内容。

enter image description here enter image description here

我正在运行 TypeScript 2.3.2 和 Lodash 4.17.4

奇怪的是,如果我说:

var values:string[] = _.map(['foo', 'bar'], String.prototype.trim);

TypeScript 错误消失了,但当 searchValue 为空且 groups 返回 [""] 时,我收到以下运行时错误:

TypeError: String.prototype.trim called on null or undefined

我尝试过的事情:

var values:string[] = _.map(_.filter(groups, group => group.indexOf("-") === -1), _.trim);
var values:string[] = _.map(_.filter(groups, function (group) { return group.indexOf("-") === -1; }), _.trim);
var values:string[] = _.map<string, (string?: string, chars?: string) => string>(_.filter(groups, function (group) { return group.indexOf("-") === -1 }), _.trim);
var values:string[] = _.map<string, (string?: string, chars?: string) => string[]>(_.filter(groups, function (group) { return group.indexOf("-") === -1 }), _.trim);
var values:string[] = _.map<string, (string: string, chars: string) => string>(_.filter(groups, function (group) { return group.indexOf("-") === -1 }), _.trim);
var values:string[] = _.map<string, (string: string) => string>(_.filter(groups, function (group) { return group.indexOf("-") === -1 }), _.trim);

一切都无济于事。我很茫然。我在这里做错了什么,或者这可能是 Lodash/TypeScript 错误?

最佳答案

以下变体似乎有效:

let values: string[] = _.map(['  foo  ', '  bar  '], str => _.trim(str))

这是我对发生这种情况的原因的猜测。 map 有很多重载,你想以这个为目标:

map<T, TResult>(
    collection: List<T> | null | undefined,
    iteratee: ListIterator<T, TResult>
): TResult[];

其中 ListIterator 定义为:

type ListIterator<T, TResult> = (value: T, index: number, collection: List<T>) => TResult;

因此您希望 trim 函数与上述 ListIterator 的定义相匹配。但是 trim 实际上定义为:

trim(
    string?: string,
    chars?: string
): string;

所以当你执行以下操作时:

let values: string[] = _.map(['  foo  ', '  bar  '], _.trim);

您实际上最终遇到了不同的过载,定义为:

    map<T, TObject extends {}>(
        collection: List<T>|Dictionary<T>|NumericDictionary<T> | null | undefined,
        iteratee?: TObject
    ): boolean[];

因此,当您切换到以下变体时:

let values: string[] = _.map(['  foo  ', '  bar  '], str => _.trim(str))

你的 trim 函数 str => _trim(str) 符合 ListIterator,即使它省略了最后 2 个参数(index集合).

关于javascript - 带有 Lodash 的 TypeScript : _. map( ["123", "234 "], _.trim) 返回 boolean[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44467778/

相关文章:

typescript - 为什么 Typescript 的 "Omit"实用程序扩展了 any 为 "K"?

javascript - 我怎样才能让这个脚本运行 onEdit

javascript - 如何使 Angular JS Controller 与指令一起工作?

c - 返回函数中声明的数组返回C中局部变量的地址?

javascript - Angular 2+ 检测服务内部的对象属性更改

reactjs - 我可以在不知道 sliced reducer 路径的情况下编写选择器吗?

javascript - jQuery滑动菜单功能

javascript - 查找一个数组中与另一个数组中的任何项目相匹配的项目

arrays - 如何从 iOS 文件管理器获取文件名数组

C++ 负数组索引