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

如何简化获取指定键对应Items的JavaScript/TypeScript辅助函数?

问题:简化获取items数组的辅助函数

我有如下JSON对象:

const data = {
  one: {
    items: [
      {
        title: 'Home',
        url: '',
      },
      {
        title: 'Title test',
        url: '/test',
      },
    ],
  },
  two: {
    items: [
      {
        title: 'Title test 2',
        url: '/test2',
      },
      {
        title: 'Title test 2',
        url: '/test2',
      },
    ],
  },
};

我编写了以下JavaScript/TypeScript辅助函数,用于从对象的one或two键中返回items数组:

interface Item {
  title: string;
  url: string;
}

const getItems = (key?: 'one') => {
  if (key === 'one') {
    return data.one.items.map((item: Item) => ({
      title: item.title,
      url: item.url,
    }));
  }
  return data.two.items.map((item: Item) => ({
      title: item.title,
      url: item.url,
    }));
};

使用方式如下:

const items = getItems('one');

items.map((item) => (
 <li>{item.title}</li>
));

请问能否简化该辅助函数,同时得到相同的结果?


简化方案

首先要说明:你代码里的map完全是冗余操作——只是把原对象的属性原样复制了一遍,直接返回原数组就能达到相同效果。基于此可以做多种简化:

方案1:极简版(支持指定one/two,默认返回two的items)

interface Item {
  title: string;
  url: string;
}

const getItems = (key: 'one' | 'two' = 'two') => data[key].items;

既保留了类型约束,又用一行代码实现逻辑:参数可选,默认使用two,直接返回对应key下的items数组。

方案2:兼容原函数参数规则(仅允许传one或不传)

interface Item {
  title: string;
  url: string;
}

const getItems = (key?: 'one') => data[key ?? 'two'].items;

用空值合并运算符??替代if判断,一行搞定分支逻辑,完全匹配原函数的参数行为。

额外优化:给data添加类型约束(可选)

如果想让TypeScript对data的结构有更强校验,避免后续结构变动引发的隐性问题,可以给data定义类型:

interface Item {
  title: string;
  url: string;
}

interface Data {
  one: { items: Item[] };
  two: { items: Item[] };
}

const data: Data = {
  // 原data内容保持不变
};

const getItems = (key: keyof Data = 'two') => data[key].items;

这样后续如果修改data的结构,TypeScript会及时抛出错误,代码更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:42:53