typescript如何声明如下结构的类型?

const data = {
  code:'948',
  '湖南省':{
    code:'32',
    '长沙市':{
      code:'88',
      '雨花区':{
        code:'9827'
      }
    }
  },
  '新疆':{
    code:'66',
    '乌鲁木齐市':{
      code:'65',
      '头屯河区':{
        code:'870'
      }
    }
  }
}

该如何声明这个data的类型呢。
我之前尝试过如下:

interface DataType {
  code: string // 这里code会报错,和string和DataType类型不兼容
  [key:string]: DataType
}

后来改成:

interface DataType {
  code: string
  [key:string]: DataType | string
}

但这样子当访问data['a'].code的时候就会报错,因为 string | DataType 没有code属性。

我觉得是因为code也是string,所以希望在DataType中的第二行的string里去掉'code'这个字符串。于是我写成:

interface DataType {
  code: string
  [key: Exclude<string, 'code'>]: DataType
}

结果这样也不行。

所以到底怎么声明这样一个类型呢,要求一个对象必须有一个键为code,值类型为字符串,其他键为字符串,值为该对象本身的类型。

求教,谢谢各位大佬。

阅读 1.5k
3 个回答
type AreaNode =({ [key: string]: AreaNode } & { code: string }) | { code: string };

const data: AreaNode = {
  code:'948',
  '湖南省':{
    code:'32',
    '长沙市':{
      code:'88',
      '雨花区':{
        code:'9827'
      }
    }
  },
  '新疆':{
    code:'66',
    '乌鲁木齐市':{
      code:'65',
      '头屯河区':{
        code:'870'
      }
    }
  }
}

传送门:TypeScript: TS Playground

我本来觉得 TypeScript 能控制类型就可以了,没想到 TypeScript 现在需要通过逻辑来匹配 JS 的动态类型……哈哈哈哈。现在写 TypeScript 已经不是在定义类型了,而是在写类型推导逻辑!
新手上路,请多包涵

你的数据结构不合理

{
  "provinces": [
    {
      "name": "北京市",
      "code": "010",
      "cities": [
        {
          "name": "北京市",
          "code": "010",
          "areas": ["东城区", "西城区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "顺义区", "昌平区", "大兴区", "怀柔区", "平谷区", "密云区", "延庆区"]
        }
      ]
    },
    // 其他省份和城市
  ]
}

参考

按你这个需求,只能这么搞

interface DataType {
  code: string
  [key: string]: DataType | string
}

const a: DataType = {
  code: '111',
  dzzzzz: {
    code: '222',
  },
}

const code = (a.dzzzzz as DataType).code
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题