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

TypeScript中如何检查联合类型实际类型并实现类型收窄

实现(Nft | null)[]到Nft[]的类型自动收窄

核心思路

利用TypeScript的**类型谓词(Type Predicate)**特性,在做运行时有效值校验的同时,让TS自动识别校验通过后的变量类型,不需要额外写强制类型转换。


方案1:全量校验,不满足则中断流程

如果你的业务要求返回的数组每一项都必须是有效Nft,只要存在null就判定为异常走错误分支,就自定义带类型谓词的校验函数:

// 类型守卫函数:返回值标记为类型谓词,TS会根据返回的布尔值做类型收窄
function isAllValidNft(arr: (Nft | null)[]): arr is Nft[] {
  // 运行时真实校验:每一项都不为null才返回true
  return arr.every(item => item !== null);
}

// 业务代码用法
const page : (Nft | null)[] = await metaplex.nfts().findAllByMintList(mintAddressPage);

if (isAllValidNft(page)) {
  // 该代码块内,page类型自动收窄为Nft[],可以直接访问Nft的所有属性、方法,无类型报错
  // 编写后续业务逻辑即可
} else {
  // 校验不通过分支:处理存在空值的异常,比如打印日志、抛出错误、返回兜底结果
  throw new Error("NFT列表查询结果存在无效空值");
}

方案2:自动过滤空值,直接得到有效Nft数组

如果你的业务允许自动剔除数组里的null项,不需要因为个别空值中断流程,可以直接在filter方法里用类型谓词,一步得到类型为Nft[]的结果:

const page : (Nft | null)[] = await metaplex.nfts().findAllByMintList(mintAddressPage);
// 过滤掉所有null值,nftList自动推导为Nft[]类型
const nftList = page.filter((item): item is Nft => item !== null);

// 后续直接操作nftList即可,类型为Nft[]

注意事项

  • 禁止直接用as Nft[]做强制类型断言,这种写法不会做任何运行时校验,一旦数组里真实存在null值,后续代码访问Nft属性时会触发无法定位的运行时错误。
  • 类型守卫的校验逻辑可以根据业务需求扩展,比如除了判断非null,还可以校验Nft对象必须存在的核心字段(比如mintAddress、name等),避免脏数据影响后续逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:30:55