You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中将(number|undefined)[]转换为number[]

如何将(number|undefined)[]转换为number[]?

你当前的代码里,map会在obj.city不是'CA'时返回undefined,因此得到(number|undefined)[]类型。后续的filter虽然在运行时剔除了undefined,但TypeScript无法自动推断类型已变更,所以仍保留原类型。以下是几种可行的修正方式:

方案1:先过滤对象,再提取ID(推荐)

先筛选出符合city === 'CA'的Person对象,再对这些对象提取id。这种方式逻辑清晰,TypeScript能直接推断出结果为number[]:

interface Person {
    id: number;
    name: string;
    city: string;
}

let personObj: Person[] = [
    { id: 1, name: 'John', city: 'LA' },
    { id: 2, name: 'Bob', city: 'CA' },
    { id: 3, name: 'Carl', city: 'CA' },
];

let objIds = personObj
  .filter(obj => obj.city === 'CA')
  .map(obj => obj.id);

doSomething(objIds); // objIds类型为number[]

方案2:给filter添加类型守卫

如果一定要用map后再filter,可以通过类型守卫明确告诉TypeScript,过滤后的数组元素不再包含undefined:

方式A:单独定义类型守卫函数

function isNumber(value: number | undefined): value is number {
  return value !== undefined;
}

let objIds = personObj
  .map(obj => obj.city === 'CA' ? obj.id : undefined)
  .filter(isNumber);

doSomething(objIds); // 类型为number[]

方式B:内联类型守卫

let objIds = personObj
  .map(obj => obj.city === 'CA' ? obj.id : undefined)
  .filter((id): id is number => id !== undefined);

doSomething(objIds); // 类型为number[]

方案3:使用类型断言(不推荐)

如果你能100%确定过滤后的数组没有undefined,可以用类型断言强制转换类型,但这种方式跳过了TypeScript的类型检查,存在风险:

let objIds = (personObj
  .map(obj => obj.city === 'CA' ? obj.id : undefined)
  .filter(id => id !== undefined)) as number[];

doSomething(objIds);

内容的提问来源于stack exchange,提问作者karPower

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:07:36