You need to enable JavaScript to run this app. 如何在TypeScript中对可能为空的数组进行类型建模
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中对可能为空的数组进行类型建模

现有写法的问题

  1. 类型语法错误:TypeScript 类型系统中联合类型使用单个竖线|,你写的A[] || []不是合法的类型定义,会导致apiData被推断为any类型,自然不会触发任何类型校验,这是你现在非法访问不报错的核心原因。
  2. 语义重复:A[]本身就已经包含空数组的情况,不需要额外联合空数组类型。

解决方案

根据你的需求可以选择以下两种适配方案:

场景1:允许返回任意长度的A类型数组(包括空数组)

直接修正类型定义即可,此时如果你访问apiData[0].a,TS本身就会提示A类型不存在a属性:

const apiData: A[] = await fetchApi()
const b = apiData[0].a // 会直接触发类型错误:类型A上不存在属性a

如果要进一步让TS校验数组下标访问可能为undefined的情况,在tsconfig.json中开启noUncheckedIndexedAccess配置:

{
  "compilerOptions": {
    "noUncheckedIndexedAccess": true
  }
}

开启后访问apiData[0].a会额外提示:对象可能为undefined,符合你对空数组下非法访问的校验要求。

场景2:严格限定返回值只能是空数组,或者至少有一个元素的A类型数组

先定义非空数组类型,再联合空数组:

type NonEmptyArray<T> = [T, ...T[]]
const apiData: NonEmptyArray<A> | [] = await fetchApi()

此时哪怕不开启noUncheckedIndexedAccess,apiData[0]的类型也会被推断为A | undefined,直接访问apiData[0].a会触发两种类型错误。


安全访问示例

你可以通过长度判断收窄类型,避免运行时报错:

if (apiData.length) {
  console.log(apiData[0].b) // 类型正常,不报错
  console.log(apiData[0].a) // 触发类型错误:A类型不存在a属性
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 12:06:12