如何在TypeScript中实现函数多个入参的类型守卫
TypeScript多参数同时类型守卫实现方案
这个需求可以实现,你原本的写法只是类型谓词的语法不符合TS规范,TS支持通过元组形式的类型谓词一次性为多个入参做类型断言。
正确的实现代码如下:
interface AbstractObject { name: string; } interface Toto extends AbstractObject { name: "toto"; doTotoThings: () => void; } interface Titi extends AbstractObject { name: "titi"; doTitiThings: () => void; } // 返回值使用元组类型谓词,同时断言两个入参的类型 const isValidTotoAndTiti = ( toto: AbstractObject | null, titi: AbstractObject | null ): [toto, titi] is [Toto, Titi] => toto?.name === 'toto' && titi?.name === "titi";
使用效果示例:
function handleAction(toto: AbstractObject | null, titi: AbstractObject | null) { if (isValidTotoAndTiti(toto, titi)) { // 此处toto会自动被推断为Toto类型,titi自动被推断为Titi类型 toto.doTotoThings(); titi.doTitiThings(); } }
如果你的场景更适合封装参数,也可以用对象形式的类型守卫实现:
interface CheckObj { toto: AbstractObject | null; titi: AbstractObject | null; } interface ValidCheckObj { toto: Toto; titi: Titi; } const isValidPair = (obj: CheckObj): obj is ValidCheckObj => obj.toto?.name === 'toto' && obj.titi?.name === 'titi'; // 使用 function handleAction(toto: AbstractObject | null, titi: AbstractObject | null) { if (isValidPair({toto, titi})) { toto.doTotoThings(); titi.doTitiThings(); } }
内容的提问来源于stack exchange,提问作者Nicolas Menettrier
相关产品推荐
相关产品推荐

