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

如何为ExtraInterface的backToStage指定嵌套对象SCENES的取值类型?

如何让TypeScript接口属性仅接受指定对象的所有值?

现有如下对象:

export const SCENES = {
  GREETING: 'scene:greeting',
  PROFILE: 'scene:profile',
  PURCHASES: 'scene:purchases',
  BALANCE: {
    ENTER_AMOUNT: 'scene:balance:enterAmount',
    INVOICE: 'scene:balance:invoice',
  },
};

以及如下接口:

interface ExtraInterface {
  backToStage?: something; // 需要取上述对象中某一元素的值
}

需求是让backToStage属性只能取SCENES对象中包含的所有值(包括嵌套层级的),实现方式如下:

实现步骤

1. 定义递归类型提取所有层级的字符串值

首先需要一个递归类型,用来遍历对象的所有层级,提取所有叶子节点的字符串类型:

// 递归提取对象所有层级的字符串值类型
type ExtractSceneValues<T> = T extends string 
  ? T 
  : { [K in keyof T]: ExtractSceneValues<T[K]> }[keyof T];

2. 生成SCENES所有值的联合类型

通过typeof SCENES获取对象的类型,再用上面的递归类型提取所有值的联合类型:

type SceneValues = ExtractSceneValues<typeof SCENES>;

此时SceneValues的类型等价于:

type SceneValues = 'scene:greeting' | 'scene:profile' | 'scene:purchases' | 'scene:balance:enterAmount' | 'scene:balance:invoice';

3. 修改接口的属性类型

把ExtraInterface中的backToStage类型替换为SceneValues:

interface ExtraInterface {
  backToStage?: SceneValues;
}

效果验证

此时backToStage只能赋值为SCENES中定义的任意字符串值,传入其他值会触发TypeScript类型错误,比如:

// 合法赋值
const validExtra: ExtraInterface = {
  backToStage: SCENES.BALANCE.INVOICE
};

// 非法赋值,TypeScript会报错
const invalidExtra: ExtraInterface = {
  backToStage: 'scene:unknown' // 类型“"scene:unknown"”不能赋值给类型“SceneValues”
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:17:08