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

2023-03-25 0 1,325
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,值类型为字符串,其他键为字符串,值为该对象本身的类型。

求教,谢谢各位大佬。

回答:

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 已经不是在定义类型了,而是在写类型推导逻辑!

谢谢大佬,你这个是最贴近需求的回答
但是在读取data的属性时类型推断会有问题,const a = data[‘sddd’] 此时a的类型推断出是any,不过感觉也没有更好的办法了。
这是一个js文件,我在给它写d.ts文件,所以不能改动数据类型,也不能在使用该对象的时候用as之类的
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. JK下载官网所有资源来源于开发团队,加入会员即可下载使用!如有问题请联系右下角在线客服!
2. JK下载官方保障所有软件都通过人工亲测,为每位会员用户提供安全可靠的应用软件、游戏资源下载及程序开发服务。
3. JK开发团队针对会员诉求,历经多年拥有现今开发成果, 每款应用程序上线前都经过人工测试无误后提供安装使用,只为会员提供安全原创的应用。
4. PC/移动端应用下载后如遇安装使用问题请联系右下角在线客服或提交工单,一对一指导解决疑难。

JK软件下载官网 技术分享 typescript如何声明如下结构的类型? https://www.jkxiazai.com/971.html

JK软件应用商店是经过官方安全认证,保障正版软件平台

相关资源

官方客服团队

为您解决烦忧 - 24小时在线 专业服务