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个回答
test
2024-07-07
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 能控制类型就可以了,没想到 TypeScript 现在需要通过逻辑来匹配 JS 的动态类型……哈哈哈哈。现在写 TypeScript 已经不是在定义类型了,而是在写类型推导逻辑!
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容