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
相关产品推荐
相关产品推荐

