告诉 TypeScript 编译器 Array.prototype.filter 从数组中删除某些类型的方法? [英] Way to tell TypeScript compiler Array.prototype.filter removes certain types from an array?

查看:24
本文介绍了告诉 TypeScript 编译器 Array.prototype.filter 从数组中删除某些类型的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to filter null (undefined) element from an array by using Array.prototype.filter but TypeScript compiler does not seem to recognize the derived array of the "filter" function and failed to pass type check.

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

Assuming following simplified code where I have an array with (number|undefined)[] types and want to filter undefined to fit into a number[] array.

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

错误说:

类型 '(number | undefined)[]' 不能分配给类型 'number[]'.输入'号码|undefined' 不能分配给类型 'number'.类型 'undefined' 不能分配给类型 'number'.

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[],如下所示,知道过滤器函数会删除 undefined.

I can cast the resulted array to number[] like below knowing filter function removes undefined.

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[]);

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

Is there a better way to achieve this other than casting?

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

Environment: TSC2.1 with strictNullChecks enabled.

推荐答案

使用 TypeScript 的 User-Defined Type Guards 特性:

Use User-Defined Type Guards feature of 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 结果的类型.

Take a look at i is number in the callback function. This trick gives us ability to cast a type of the Array.filter result.

这篇关于告诉 TypeScript 编译器 Array.prototype.filter 从数组中删除某些类型的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆