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

如何为包含必选字段和未知键的递归对象声明TypeScript类型

递归嵌套对象的TypeScript类型声明方案

报错原因

你之前的写法触发TS报错的核心原因是:[key: string | number]: propTypes 这个索引签名约定了所有字符串、数字类型的键对应的值都必须是propTypes类型,但你定义的name、link字段是字符串类型,不符合索引签名的类型要求,因此抛出类型不兼容错误。

解决方案

根据你的实际使用场景可以选择以下两种方案:

方案1:子节点仅为数字键(匹配你给出的示例结构)

如果你的嵌套子节点的键都是数字类型,只需要把索引签名限定为数字类型即可,不会和字符串类型的name、link字段产生冲突:

type PropType = {
  name: string;
  link: string;
  [key: number]: PropType;
};

这个类型完全适配你提供的对象示例,不会产生任何报错。

方案2:子节点支持字符串键

如果你的嵌套子节点也可能使用字符串类型的键(不能是name、link这两个保留字段),可以将索引签名的返回值设为联合类型,使用时通过类型守卫收窄类型即可:

type PropType = {
  name: string;
  link: string;
  [key: string]: PropType | string;
};

// 类型守卫,用于收窄字段类型
function isPropType(value: PropType | string): value is PropType {
  return typeof value === 'object' && value !== null && 'name' in value && 'link' in value;
}

// 使用示例
const node = obj['customStringKey'];
if (isPropType(node)) {
  // 此处node被自动推断为PropType类型,可安全访问属性
  console.log(node.name, node.link);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:06:03