如何在TypeScript中规避数组find返回确定时的'Object is possibly undefined'错误
解决TypeScript中find返回值的"Object is possibly 'undefined'"错误(不使用可选链)
你编写的TypeScript代码如下:
type Course = { name: string; grade: Grade; credits: number; } type Grade = typeof gradePoints[number]['letter']; const courseData = [ { name: 'Math', grade: 'A', credits: 3 }, { name: 'Science', grade: 'B', credits: 4 }, { name: 'English', grade: 'C', credits: 2 }, ] const gradePoints = [ { letter: 'A', value: 4.0 }, { letter: 'B', value: 3.0 }, { letter: 'C', value: 2.0 }, ] as const; for (const course of courseData) { const gradePoint = gradePoints.find((gp) => gp.letter === course.grade).value; console.log(gradePoint); }
执行const gradePoint = gradePoints.find((gp) => gp.letter === course.grade).value;时,TypeScript提示Object is possibly 'undefined'。由于你确定courseData中的grade必然存在于gradePoints中,不想用可选链修复,可通过以下几种方式解决:
使用非空断言(!)
直接在find方法后添加!,明确告诉TypeScript该返回值不可能是undefined:for (const course of courseData) { const gradePoint = gradePoints.find((gp) => gp.letter === course.grade)!.value; console.log(gradePoint); }注意:这种方式依赖你对业务逻辑的绝对确定,如果未来
courseData中出现了不在gradePoints里的grade,运行时会抛出错误。自定义类型守卫
编写一个类型守卫函数,让TypeScript在代码逻辑中确认find的返回值不为undefined:// 定义类型守卫函数 function isGradePoint(gp: typeof gradePoints[number] | undefined): gp is typeof gradePoints[number] { return gp !== undefined; } for (const course of courseData) { const gp = gradePoints.find((gp) => gp.letter === course.grade); if (isGradePoint(gp)) { // 此时TypeScript知道gp一定不是undefined const gradePoint = gp.value; console.log(gradePoint); } }这种方式更严谨,通过代码逻辑让TypeScript自动推断类型,避免了断言的潜在风险。
重构为映射对象(推荐)
把gradePoints从数组改成键值对对象,利用TypeScript的索引类型确保访问安全,同时提升查找效率:// 重构为映射对象 const gradePointMap = { A: 4.0, B: 3.0, C: 2.0, } as const; type Grade = keyof typeof gradePointMap; type Course = { name: string; grade: Grade; credits: number; } const courseData = [ { name: 'Math', grade: 'A', credits: 3 }, { name: 'Science', grade: 'B', credits: 4 }, { name: 'English', grade: 'C', credits: 2 }, ] for (const course of courseData) { // TypeScript能直接推断course.grade是gradePointMap的合法键,不会有undefined问题 const gradePoint = gradePointMap[course.grade]; console.log(gradePoint); }这种方式不仅解决了类型错误,还让查找操作从O(n)变成O(1),类型推导也更清晰,是最推荐的方案。
内容的提问来源于stack exchange,提问作者margherita pizza
相关产品推荐
相关产品推荐

