带Lodash的TypeScript:_. map([“123”,“234”],_。terim)返回boolean []?

时间:2017-06-09 23:06:18

标签: 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调用null或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错误?

2 个答案:

答案 0 :(得分:6)

以下变体似乎有效:

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;

因此,您希望修剪功能与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))

您的修剪功能str => _trim(str)符合ListIterator,即使它遗漏了最后两个参数(indexcollection)。

答案 1 :(得分:3)

问题是_.trim可以带两个参数:

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

这与lodash&#39; ListIterator类型不兼容,其中第二个参数(如果存在)是一个数字(索引)。

因此编译器回退到_.map函数的不同类型,这是一个模糊的函数,它将一个对象作为iteratee并返回一个布尔数组(&#34;对于属性的元素返回true)给定对象,否则为false。&#34;)

Frank Modica的回答给出了正确的解决方案。