TypeScript联合类型扩展时,如何自动检测条件判断遗漏?
解决方法
当给Feline类型新增'Tiger'后,有两种思路处理现有判断逻辑:
思路一:自动适配新增类型,无需修改现有判断
不用硬编码枚举Feline的具体值,利用TypeScript的类型窄化特性直接判断结构:
let x: AnimalInfo = getAnimal(1); // 直接检查Owner属性是否存在,TypeScript会自动窄化到带Owner的Feline分支 if ('Owner' in x) { console.log(x.Owner); }
后续不管给Feline加多少新成员(只要保持带Owner的结构),这段判断都能自动覆盖,完全不用修改。
也可以自定义类型守卫函数,更明确地判断类型:
function isFeline(animal: AnimalInfo): animal is Extract<AnimalInfo, { Category: Feline }> { return (['Lion', 'Cat', 'Tiger'] as const).includes(animal.Category as Feline); } // 使用类型守卫 if (isFeline(x)) { console.log(x.Owner); }
新增Feline成员时,只需要更新守卫函数里的数组即可,判断逻辑本身不用改。
思路二:新增成员时触发编译错误,强制更新判断
如果要保留硬编码的判断逻辑,让TypeScript在Feline新增成员时主动报错提醒,可以通过never类型做穷尽检查:
let x: AnimalInfo = getAnimal(1); if(x.Category === 'Lion' || x.Category === 'Cat'){ console.log(x.Owner); } else { // 当Feline新增Tiger后,x.Category可能为Tiger,无法赋值给never类型,触发编译错误 const _exhaustiveCheck: never = x.Category; throw new Error(`Unexpected animal category: ${_exhaustiveCheck}`); }
这种方式会在你遗漏新增的Feline成员时,直接在编译阶段报错,强制你更新判断条件。
也可以把Feline的枚举值抽成常量数组,结合穷尽检查,让修改更集中:
const FELINE_TYPES = ['Lion', 'Cat'] as const; type Feline = typeof FELINE_TYPES[number]; let x: AnimalInfo = getAnimal(1); if(FELINE_TYPES.includes(x.Category as Feline)){ console.log(x.Owner); } else { const _exhaustiveCheck: never = x.Category; throw new Error(`Unexpected animal category: ${_exhaustiveCheck}`); }
后续新增Tiger时,只需修改FELINE_TYPES数组;如果忘了改,穷尽检查会立刻报错。
内容的提问来源于stack exchange,提问作者mehran
相关产品推荐
相关产品推荐

