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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:15:03