如何轻松获取JavaScript数组的最小或最大元素?
示例Psuedocode:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
Run Code Online (Sandbox Code Playgroud) 我正在使用chrome 70和chrome确实添加了方法.flatMap, .flatten, .flat.所以我的代码确实按预期运行.不幸的是,Typescript不喜欢它.
// data.flatMap lint error
export const transformData = (data: any[]) => data.flatMap(abc => [
parentObj(abc),
...generateTasks(abc)
]);
Run Code Online (Sandbox Code Playgroud)
我得到的警告是 TS2339: Property 'flatMap' does not exist on type 'any[]'.
通过我使用的方式Angular 6,它使用Typescript ~2.9.2我已经包括import 'core-js/es7/array';在polyfills.ts.
我的猜测是这些方法没有打字,我确实试过npm run -dev @types/array.prototype.flatmap但仍未解决.
当一个对象有一个可能未定义的 id 且您想要从这些对象的数组中选择所有现有 id 时,为什么以下代码会产生 Typescript 错误,指出 y.id 可能未定义?
.filter(x => x.id !== undefined).map(y => y.id)
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我想不必undefined为filteredDevice添加类型注释。我认为一个被过滤的设备不应该是未定义的,因为我过滤掉了未定义的设备。
但是如果我删除undefined类型注释,TypeScript 会抱怨Type 'ICouchDBDocument | undefined' is not assignable to type 'ICouchDBDocument'.
devices
.filter((device: ICouchDBDocument | undefined) => Boolean(device)) //should filter away all undefined devices?
.map((filteredDevice: ICouchDBDocument | undefined) => { ... })
Run Code Online (Sandbox Code Playgroud)
如何更改我的代码,以便过滤器对类型注释产生影响?
我努力让打字稿理解我已经project在这个(缩短的)示例中处理一个属性()的未定义情况:
interface Entry {
id: number
project?: Project
isPublished?: boolean
}
entries
.filter(entry => !!entry.project)
.map(entry => ({
title: entry.project.title
}))
Run Code Online (Sandbox Code Playgroud)
(这里entries是 s 的数组Entry),编译器在属性上抱怨entry.project.title,project即使TS2532: Object is possibly 'undefined'我有过滤器删除未定义的。其他可选属性在过滤后仍然是可选的,因此我无法使用Required接口:/
如何让 TS 明白该属性是在 map 函数中明确定义的?
谢谢
-- 编辑:添加了另一个可选属性/说明作为对建议答案的响应,这将使所有属性成为必需
请考虑下面的代码以strictNullChecks打开:
var a: (number | null)[] = [0, 1, 2, 3, null, 4, 5, 6];
var b: { value: number; }[] = a.map(x => x != null && { value: x }).filter(Boolean);
Run Code Online (Sandbox Code Playgroud)
由于以下原因,它无法编译:
Type '(false | { value: number; })[]' is not assignable to type '{ value: number; }[]'.
Type 'false | { value: number; }' is not assignable to type '{ value: number; }'.
Type 'false' is not assignable to type '{ value: number; }'. …Run Code Online (Sandbox Code Playgroud) 我遇到了一个有趣的案例,其中TypeScript编译器(带有strictNullChecks === true)不允许我将过滤掉null的数组传递给需要数字数组的函数。
这是显示问题的代码示例:
class Test {
constructor() {
const values = [1, 2, null, 4].filter(x => x);
this.printNumberArray(values);
}
printNumberArray(values: number[]) {
console.log(values);
}
}
Run Code Online (Sandbox Code Playgroud)
这将导致出现一个红色的花体,并显示以下values错误:
Argument of type '(number | null)[]' is not assignable to parameter of type 'number[]'.
Type 'number | null' is not assignable to type 'number'.
Type 'null' is not assignable to type 'number'.
const values: (number | null)[]
Run Code Online (Sandbox Code Playgroud)
在filter保证消除空值,但显然编译器无法识别。
我可以通过将数组中的所有值强制转换为数字来解决此问题,如下所示:
const values = [1, 2, null, …Run Code Online (Sandbox Code Playgroud)