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

TypeScript中如何避免可选属性访问时的undefined报错?

解决方案

1. 用类型守卫过滤数组

提前过滤掉数组中info为undefined的元素,TypeScript会自动推断后续访问的元素一定包含info:

interface Book {
    id: number
    info?: {
        name: string,
    }
}

const bookList: Book[] = [
    { id: 1, info: { name: "TypeScript实战" } },
    { id: 2 }
];

// 过滤出存在info的有效元素
const validBooks = bookList.filter(book => book.info !== undefined);

// 此时访问不会触发空值报错
console.log(validBooks[0].info.name);

2. 拆分类型区分场景

定义两个接口,分别对应“含完整info的Book”和“允许info缺失的Book”,按需使用:

// 完整结构的Book,info必填
interface CompleteBook {
    id: number
    info: {
        name: string,
    }
}

// 允许info缺失的Book
interface PartialBook extends Omit<CompleteBook, 'info'> {
    info?: CompleteBook['info']
}

const bookList: PartialBook[] = [
    { id: 1, info: { name: "TypeScript实战" } },
    { id: 2 }
];

// 转换为完整类型后访问
const firstValidBook = bookList[0] as CompleteBook;
console.log(firstValidBook.info.name);

3. 集中做非空断言(限明确安全的场景)

如果能确定数组中特定位置的元素一定有info,可以在初始化时集中做类型断言,避免多处加!:

interface Book {
    id: number
    info?: {
        name: string,
    }
}

const bookList: Book[] = [
    { id: 1, info: { name: "TypeScript实战" } } as Required<Book>,
    { id: 2 }
];

// 访问第一个元素不会报错
console.log(bookList[0].info.name);

4. 修改编译器配置(谨慎使用)

若项目可以接受全局关闭空值检查,可修改tsconfig.json的strictNullChecks为false,但这会隐藏所有空值相关的潜在问题,不推荐大型项目使用:

{
  "compilerOptions": {
    "strictNullChecks": false
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:55:32