TypeScript 泛型函数实现从对象数组指定键提取非undefined已定义值
问题原因
你原有实现的核心问题有三个:
- 泛型参数约束没有兼容字段带
undefined的场景,和你的PurchaseResult类型不匹配 filter方法没有加类型谓词,TS无法自动完成类型收窄,没法把undefined从返回值类型里排除- 调用函数时传参顺序写反了,函数要求第一个参数是数组、第二个是字段名,你反过来传了
正确实现
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
相关产品推荐
相关产品推荐

