gpt4 book ai didi

typescript - 告诉 TypeScript 编译器 Array.prototype.filter 从数组中删除某些类型的方法?

转载 作者:搜寻专家 更新时间:2023-10-30 20:33:26 25 4
gpt4 key购买 nike

我正在尝试使用 Array.prototype.filter 从数组中过滤空(未定义)元素,但 TypeScript 编译器似乎无法识别“过滤”函数的派生数组,并且未能通过类型检查。

假设在下面的简化代码中,我有一个具有 (number|undefined)[] 类型的数组,并且想要过滤 undefined 以适应 number[] 数组。

const arry = [1, 2, 3, 4, "5", 6];
const numArry: number[] = arry
.map((i) => {
return typeof i === "number" ? i : void 0;
})
.filter((i) => i);

错误说:

Type '(number | undefined)[]' is not assignable to type 'number[]'. Type 'number | undefined' is not assignable to type 'number'. Type 'undefined' is not assignable to type 'number'.

我可以将结果数组转换为 number[],如下所示,知道过滤函数会删除未定义的。

const arry = [1, 2, 3, 4, "5", 6];
const numArry: number[] = (arry
.map((i) => {
return typeof i === "number" ? i : void 0;
})
.filter((i) => i) as Number[]);

除了转换之外,还有更好的方法来实现这一点吗?

环境:启用了 strictNullChecks 的 TSC2.1。

最佳答案

使用 TypeScript 的用户定义类型保护功能:

const arry = [1, 2, 3, 4, "5", 6];
const numArry: number[] = arry
.filter((i): i is number => {
return typeof i === "number";
});
// numArry = [1, 2, 3, 4, 6]

看看回调函数中的i is number。这个技巧使我们能够转换 Array.filter 结果的类型。

关于typescript - 告诉 TypeScript 编译器 Array.prototype.filter 从数组中删除某些类型的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43010737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com