跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • typescript 如何定义无限嵌套的对象数组类型?
未分類
30 11 月 2020

typescript 如何定义无限嵌套的对象数组类型?

typescript 如何定义无限嵌套的对象数组类型?

資深大佬 : nikolausliu 0

我有类似这样一个数组:

“`javascript
const array = [
{
name: ‘a’,
children: [
{
name: ‘aa’,
children: [
{
name: ‘aaa’,
children: []
}
]
},
{
name: ‘ab’,
children: []
},
]
},
{
name: ‘b’,
children: [
{
name: ‘ba’,
children: []
},
{
name: ‘bb’,
children: []
},
]
},
]
“`

我希望定义一个函数来展平这个多维嵌套的对象数组,把它变成这样:

“`javascript
[
{name: ‘a’, children: []},
{name: ‘aa’, children: []},
{name: ‘aaa’, children: []},
{name: ‘ab’, children: []},
{name: ‘b’, children: []},
{name: ‘ba’, children: []},
{name: ‘bb’, children: []},
]
“`

我的函数是这样写的:

“`javascript
function flat(array, children = ‘children’) {
const res = []
const recursive = (target) => {
target.map(item => {
res.push(item)
if(item.hasOwnProperty(children) && item[children].length) {
recursive(item[children])
}
})
}
recursive(array)
return res
}
“`

到目前为止,需求是可以实现的。但是当我想用 typescript 来实现的时候,我发现我不知道该如何定义 array 的类型了。万 v 友,求帮助啊
发现 V2EX 对 markdown 代码块语法支持的不太好,贴个[有道云笔记地址]( http://note.youdao.com/noteshare?id=b80252fbd7248f58dc14446823ff90a1&sub=2839057A8A83481C9AE6D1632E63F819)

大佬有話說 (9)

  • 資深大佬 : ytxbnahn

    interface DataType {
    name:string;
    children:DataType[]
    }

  • 主 資深大佬 : nikolausliu

    @ytxbnahn 可能我表达的不够清楚,{name,children}只是举个例子,实际上 flat 函数应该处理的是一个泛型的对象数组,比如可能是[{a, b, c, children}]或者[{x, y, children}],甚至我希望 children 是可以配置的,比如叫 child (参考我的 flat 函数,children 参数给了默认值是可以传入其它参数的)。这样的话要怎么定义呢?

  • 資深大佬 : ytxbnahn

    @nikolausliu

    flat<DataType>(array,children)

    function flat<T>(array:T, children = ‘children’) {

    }

  • 資深大佬 : joesonw

    interface Data<T> {
    [k: string]: string | Array<Data<T>>;
    }

    function flat<T>(array: Data<T>, children: keyof T) {}

    flat({ children: [{ a: ‘123’ }] }, ‘children’)

  • 主 資深大佬 : nikolausliu

    @joesonw
    感谢你提供的思路,我改写了下,现在成功了:
    export interface Obj<T>{
    [k: string]: any
    children: Array<Obj<T>>
    }

    export function flatObjectArray<T>(array: Array<Obj<T>>): Array<Obj<T>> {
    const res: Array<Obj<T>> = []
    function recursive(target: Array<Obj<T>>) {
    target.map((item: Obj<T>) => {
    res.push(item)
    if(item.hasOwnProperty(‘children’) && item.children.length) {
    recursive(item.children)
    }
    })
    }
    recursive(array)
    return res
    }

    typescript 如何定义无限嵌套的对象数组类型?

    不过,我现在是把 children 这个参数固定死了,如果我希望使用动态的 children,并且在函数定义中明确指定 children 这个参数不能是其它 key 的话(你上面 children: keyof T 的写法 children 实际可以传入 a,b,c 等),应该怎么写呢?

    我初步的想法是

    export interface Obj<T>{
    [k: string]: any
    [children: string]: Array<Obj<T>>
    }
    可是应该怎么定义函数的 children 参数的类型呢?

  • 資深大佬 : Flands

    碰到这种极其复杂的类型判断我都是一个`any[]`上去…
    可能太懒了吧,用单测跑过就行

  • 資深大佬 : joesonw

    @nikolausliu 大概是可以的, 有一段时间没写前端了. 但是可以试试 interface Obj<T, K extends string> { [key in K]: Array<Obj<T, K>> } 类似的

    https://stackoverflow.com/questions/56419558/typescript-how-to-use-a-generic-parameter-as-object-key

  • 主 資深大佬 : nikolausliu

    @joesonw 好嘞,我试试

  • 資深大佬 : buhi

    type MayhaveChildren<K extends string> = {
    [k in K]: MayhaveChildren<K>[]
    }

    type Flatten<K extends string, T extends MayhaveChildren<K>> = T[]

    function flatten<K extends string, T extends MayhaveChildren<K>>(data:T[], k: K & keyof T): Flatten<K, T>

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具