mho*_*ges 4 javascript arrays typescript lodash
我有一个字符串数组,它们像这样拆分:
var searchValue = "600-800, 123, 180";
var groups = searchValue.split(","); // => ["600-800", " 123", " 180"]
Run Code Online (Sandbox Code Playgroud)
(因此项目周围可能有空白),我想删除空白。我知道,我可以用Array.prototype.map用String.prototype.trim,但我想特别是使用Lodash的解决方案。
根据文档,我应该可以说:_.map([' foo ', ' bar '], _.trim);它将返回['foo', 'bar'],这是一个string[]。
但是,TypeScript令我烦恼。这是我在编辑器中看到的内容。
我正在运行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或未定义
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);
Run Code Online (Sandbox Code Playgroud)
一切都无济于事。我很茫然。我在这里做错什么了吗,或者这可能是Lodash / TypeScript错误?
以下变体似乎起作用:
let values: string[] = _.map([' foo ', ' bar '], str => _.trim(str))
Run Code Online (Sandbox Code Playgroud)
这是为什么的原因,这是我的猜测。有许多重载map,并且您要针对此重载:
map<T, TResult>(
collection: List<T> | null | undefined,
iteratee: ListIterator<T, TResult>
): TResult[];
Run Code Online (Sandbox Code Playgroud)
其中ListIterator定义为:
type ListIterator<T, TResult> = (value: T, index: number, collection: List<T>) => TResult;
Run Code Online (Sandbox Code Playgroud)
因此,您希望修整功能与的上述定义匹配ListIterator。但trim实际上定义为:
trim(
string?: string,
chars?: string
): string;
Run Code Online (Sandbox Code Playgroud)
因此,当您执行以下操作时:
let values: string[] = _.map([' foo ', ' bar '], _.trim);
Run Code Online (Sandbox Code Playgroud)
您实际上最终遇到了另一个过载,定义为:
map<T, TObject extends {}>(
collection: List<T>|Dictionary<T>|NumericDictionary<T> | null | undefined,
iteratee?: TObject
): boolean[];
Run Code Online (Sandbox Code Playgroud)
因此,当您切换到以下变体时:
let values: string[] = _.map([' foo ', ' bar '], str => _.trim(str))
Run Code Online (Sandbox Code Playgroud)
您的修整函数str => _trim(str)符合ListIterator,即使它省略了最后两个参数(index和collection)。