1
ytxbnahn 2020-11-27 16:14:30 +08:00 1
interface DataType {
name:string; children:DataType[] } |
2
daguaochengtang OP @ytxbnahn 可能我表达的不够清楚,{name,children}只是举个例子,实际上 flat 函数应该处理的是一个泛型的对象数组,比如可能是[{a, b, c, children}]或者[{x, y, children}],甚至我希望 children 是可以配置的,比如叫 child (参考我的 flat 函数,children 参数给了默认值是可以传入其它参数的)。这样的话要怎么定义呢?
|
3
ytxbnahn 2020-11-27 16:25:14 +08:00
|
4
joesonw 2020-11-27 16:30:59 +08:00
interface Data<T> {
[k: string]: string | Array<Data<T>>; } function flat<T>(array: Data<T>, children: keyof T) {} flat({ children: [{ a: '123' }] }, 'children') |
5
daguaochengtang OP @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 } 不过,我现在是把 children 这个参数固定死了,如果我希望使用动态的 children,并且在函数定义中明确指定 children 这个参数不能是其它 key 的话(你上面 children: keyof T 的写法 children 实际可以传入 a,b,c 等),应该怎么写呢? 我初步的想法是 export interface Obj<T>{ [k: string]: any [children: string]: Array<Obj<T>> } 可是应该怎么定义函数的 children 参数的类型呢? |
6
Flands 2020-11-28 10:27:28 +08:00
碰到这种极其复杂的类型判断我都是一个`any[]`上去...
可能太懒了吧,用单测跑过就行 |
7
joesonw 2020-11-29 16:10:46 +08:00 1
@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 |
8
daguaochengtang OP @joesonw 好嘞,我试试
|
9
buhi 2020-11-30 10:22:52 +08:00 1
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> |