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

如何在TypeScript中显式定义表示类型守卫的类型?

如何在TypeScript中显式定义类型守卫对象的类型

你可以通过映射类型结合类型守卫的返回类型语法,实现符合需求的显式类型定义。核心是在映射每个键时,将函数的返回类型指定为value is ValueMap[K],其中ValueMap[K]对应键K所关联的实际类型。

步骤1:定义基础类型

首先保留你的基础类型定义:

type ValueMap = {
  string: string;
  number: number;
};

type Value = ValueMap[keyof ValueMap]; // 类型为 string | number

步骤2:显式定义类型守卫对象类型

使用映射类型创建TypedGuards,每个键对应的函数都是合法的类型守卫:

type TypedGuards = {
  [K in keyof ValueMap]: (value: Value) => value is ValueMap[K];
};

这里的K遍历ValueMap的所有键,ValueMap[K]会自动解析为对应键的实际类型(比如键"number"对应类型number),从而让函数满足类型守卫的语法要求。

步骤3:使用类型创建守卫对象

基于TypedGuards定义守卫对象,TypeScript会自动校验每个函数是否符合类型守卫的规则:

const guards: TypedGuards = {
  number: (value): value is number => typeof value === "number",
  string: (value): value is string => typeof value === "string",
};

步骤4:验证类型推断效果

在条件判断中使用这些守卫时,TypeScript能正确推断值的具体类型:

function processValue(val: Value) {
  if (guards.number(val)) {
    // val 被推断为 number 类型
    console.log("数字:", val.toFixed(1));
  } else if (guards.string(val)) {
    // val 被推断为 string 类型
    console.log("字符串长度:", val.length);
  }
}

原写法错误原因

你之前尝试的(value: Value):value is K => boolean语法无效,是因为K是字符串字面量类型(比如"number"),而我们需要断言的是值的类型为ValueMap[K](即number),而非字符串字面量本身。通过ValueMap[K]才能关联到正确的目标类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:01:20