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

如何为Palette对象指定键子集创建TypeScript联合类型?

从Palette对象提取指定键的TypeScript类型实现方案

步骤1:确保Palette对象保留字面量类型

先给你的Palette对象加上as const断言,让TypeScript捕获精确的键和子键类型,而不是宽泛的string:

const palette = {
    black: "#000",
    white: "#fff",
    primary: {
      "50": "#somecolor",
      "100": "#somecolor",
      "300": "#somecolor",
      "500": "#somecolor",
      "700": "#somecolor",
    },
    grey: {
      "50": "#somecolor",
      "300": "#somecolor",
      "500": "#somecolor",
      "700": "#somecolor",
      "900": "#somecolor",
    },
    green: {
      "100": "#somecolor",
      "300": "#somecolor",
      "500": "#somecolor",
      "700": "#somecolor",
    },
    blue: {
      "100": "#somecolor",
      "300": "#somecolor",
      "500": "#somecolor",
      "700": "#somecolor",
    },
    pink: {
      "100": "#somecolor",
      "300": "#somecolor",
      "500": "#somecolor",
      "700": "#somecolor",
    },
    red: {
      "300": "#somecolor",
      "500": "#somecolor",
      "700": "#somecolor",
    },
    background: {
      "500": "#somecolor",
      "700": "#somecolor",
    }
} as const;

步骤2:创建目标Theme类型

根据需求有两种实现方式:

方式1:手动指定固定联合类型

如果只需要固定的几个键,直接写联合类型最直观:

type Theme = "blue" | "green" | "primary" | "pink";

方式2:自动筛选含指定子键的属性(可选)

如果想自动筛选出包含500子键的Palette属性(避免手动维护),可以用TypeScript条件类型:

// 获取Palette所有键的类型
type PaletteKeys = keyof typeof palette;

// 筛选出对应属性包含"500"子键的键
type ThemeWith500 = PaletteKeys extends keyof typeof palette 
  ? "500" extends keyof typeof palette[PaletteKeys] 
    ? PaletteKeys 
    : never 
  : never;

// 若只需要其中特定几个,用Extract进一步筛选
type Theme = Extract<ThemeWith500, "blue" | "green" | "primary" | "pink">;

步骤3:使用Theme类型实现安全取值

现在可以用Theme类型的变量安全访问palette的对应属性和500子键:

// 定义取值函数
const getCurrentColor = (theme: Theme) => {
  return palette[theme]["500"];
};

// 调用示例
const currentBlue = getCurrentColor("blue"); // 类型为字面量"#somecolor"
const currentPrimary = getCurrentColor("primary"); // 类型完全安全

注意事项

  • 如果palette是从其他文件导入的,导出时需加上as const或标记为readonly,否则TypeScript会把键推断为宽泛的string,无法提取字面量类型。
  • 该方案在Next.js + React Native环境下完全兼容,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:01:45