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
相关产品推荐
相关产品推荐

