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

TypeScript 泛型函数实现从对象数组指定键提取非undefined已定义值

问题原因

你原有实现的核心问题有三个:

  1. 泛型参数约束没有兼容字段带undefined的场景,和你的PurchaseResult类型不匹配
  2. filter方法没有加类型谓词,TS无法自动完成类型收窄,没法把undefined从返回值类型里排除
  3. 调用函数时传参顺序写反了,函数要求第一个参数是数组、第二个是字段名,你反过来传了

正确实现

const extractOnlyDefinedValuesFromArrayOfObjects = <
  A extends Record<string, any>,
  K extends keyof A
>(
  list: A[],
  key: K
): NonNullable<A[K]>[] => {
  return list
    .map(obj => obj[key])
    // 加类型谓词告诉TS过滤后的值一定是非undefined的
    .filter((value): value is NonNullable<A[K]> => typeof value !== 'undefined');
};

使用示例

不需要手动传入泛型参数,TS会自动推断类型:

// 示例数据源
const arrayOfResults: PurchaseResult[] = [
  { result: 'order1', error: undefined },
  { result: undefined, error: new Error('支付失败') }
];

// 提取所有非undefined的error,自动推断类型为 Error[]
const extractedErrors = extractOnlyDefinedValuesFromArrayOfObjects(arrayOfResults, 'error');

// 提取所有非undefined的result,自动推断类型为 Value[](即string[])
const extractedResults = extractOnlyDefinedValuesFromArrayOfObjects(arrayOfResults, 'result');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:04