ES6 +允许这种简单/干净的方法
[{"id":1}, {"id":-2}, {"id":3}].find(myObj => myObj.id < 0) // returns {"id":-2}
TypeScript实现了许多ES6 +功能,并且继续这样做。它似乎至少有一个很好的解决方案,所以:
如何使用TypeScript在数组中找到项目,考虑到易用性,现代最佳实践以及简洁优雅?
(略微重述问题以寻求最佳方法)
注释
&#34;的项目&#34;可以是JavaScript对象,或几乎任何其他东西。上面的例子恰好是找到普通的&#39;本机JS对象,但存在许多场景。
&#34;的规范&#34;在计算机科学(和其他领域)中说“#34;普遍接受的规则或标准公式&#34; (记住这里的每个人都不知道在某些时候)
这不是关于新功能。任何版本的JS都可以做到这一点。然而,这样做的形式越来越少吸引你越来越有吸引力。
答案 0 :(得分:72)
第一部分 - Polyfill
对于尚未实现它的浏览器,array.find
的polyfill。 Courtesy of MDN
if (!Array.prototype.find) {
Array.prototype.find = function(predicate) {
if (this == null) {
throw new TypeError('Array.prototype.find called on null or undefined');
}
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
var list = Object(this);
var length = list.length >>> 0;
var thisArg = arguments[1];
var value;
for (var i = 0; i < length; i++) {
value = list[i];
if (predicate.call(thisArg, value, i, list)) {
return value;
}
}
return undefined;
};
}
第二部分 - 界面
您需要扩展open Array接口以包含find
方法。
interface Array<T> {
find(predicate: (search: T) => boolean) : T;
}
当它到达TypeScript时,您将收到编译器的警告,提醒您删除它。
第三部分 - 使用它
变量x
将具有预期的类型... { id: number }
var x = [{ "id": 1 }, { "id": -2 }, { "id": 3 }].find(myObj => myObj.id < 0);
答案 1 :(得分:13)
对于某些项目,您可以更轻松地将目标设置为es6
中的tsconfig.json
。
{
"compilerOptions": {
"target": "es6",
...
答案 2 :(得分:13)
使用tsconfig.json 你也可以像这样定位es5:
{
"compilerOptions": {
"experimentalDecorators": true,
"module": "commonjs",
"target": "es5"
}
...
答案 3 :(得分:0)
你可以使用下划线库。
安装它:
npm install underscore --save
npm install @types/underscore --save-dev
导入
import _ = require('underscore');
使用它
var x = _.filter(
[{ "id": 1 }, { "id": -2 }, { "id": 3 }],
myObj => myObj.id < 0)
);
答案 4 :(得分:-1)
如果您需要一些不受Typescript支持的es6改进,您可以在tsconfig中定位es6并使用Babel转换es5中的文件。