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

TypeScript如何获取接口中联合类型的子类型用于比较?

TypeScript接口联合类型的枚举式访问方案

先看你定义的接口:

export interface IMyInterface {
    category: "Primary" | "Secondary" | "Tertiary",
}

你想实现类似枚举那样直接访问"Primary"这类值用于比较,比如你尝试的typeof(myVariableWhichImplementsIMyInterface.category).Primary写法,当前是行不通的——TypeScript的类型信息(包括接口、联合类型)仅存在于编译阶段,编译成JavaScript后会被完全移除,运行时根本拿不到这些类型定义,所以没法通过typeof去访问类型层面的联合成员。

下面给你两种可行的解决方案,既能满足类型约束,又能像枚举那样便捷地访问常量值:

方案一:使用常量对象推导类型

先定义一个包含所有枚举值的常量对象,再基于它推导类型,这样运行时能拿到具体值,类型层面也能约束接口:

// 定义常量对象,as const确保类型被推断为字面量类型而非string
export const Category = {
  Primary: "Primary",
  Secondary: "Secondary",
  Tertiary: "Tertiary"
} as const;

// 推导联合类型
export type CategoryType = typeof Category[keyof typeof Category];

// 用推导的类型定义接口
export interface IMyInterface {
  category: CategoryType;
}

使用时直接通过Category.Primary访问常量值做比较:

const myObj: IMyInterface = { category: Category.Primary };

if (myObj.category === Category.Primary) {
  // 这里写你的业务逻辑
}

方案二:直接使用字符串枚举

如果习惯用枚举语法,直接定义字符串枚举即可,TypeScript的枚举在运行时会被编译成真实的对象,能直接访问成员:

export enum Category {
  Primary = "Primary",
  Secondary = "Secondary",
  Tertiary = "Tertiary"
}

export interface IMyInterface {
  category: Category;
}

使用方式和方案一一致:

const myObj: IMyInterface = { category: Category.Primary };

if (myObj.category === Category.Primary) {
  // 业务逻辑处理
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:52:16