数组连接的返回类型

mai*_*idi 5 typescript

我有一个方法可以从嵌套对象中创建扁平对象数组。

{a: 'b',
 c: {d: 'e'}
}
Run Code Online (Sandbox Code Playgroud)

[{a: 'b'}, {d:'e'}]
Run Code Online (Sandbox Code Playgroud)

所以这个方法的返回类型是一个对象数组( Record<string, any>[])。但 Typescript 给出以下错误:

TS2769:没有与此调用匹配的重载。... 'Record<string, any>[] | 类型的参数 { [x:字符串]:任意;}' 不可分配给“ConcatArray”类型的参数。类型“Record<string,any>[]”不可分配给类型“ConcatArray”。

该方法的正确返回类型是什么_flatten

const _flatten = (obj: Record<string, any>): Record<string, any>[] =>  
    [].concat(...Object.keys(obj)
             .map((key: string) => (
                   typeof obj[key] === 'object' ? _flatten(obj[key]) : { [key]: obj[key] }
             ))
         );
Run Code Online (Sandbox Code Playgroud)

gli*_*a93 6

我猜错误信息是这样的:

Type 'Record<string, any>[]' is not assignable to type 'ConcatArray<never>'
Run Code Online (Sandbox Code Playgroud)

那是因为你使用了[].concatand[]类型never[]

尝试改用Array.prototype.concat

const _flatten = (obj: Record<string, any>): Record<string, any>[] =>  
    Array.prototype.concat(...Object.keys(obj)
             .map((key: string) => (
                   typeof obj[key] === 'object' ? _flatten(obj[key]) : { [key]: obj[key] }
             ))
         );
Run Code Online (Sandbox Code Playgroud)

打字稿沙箱

或者你可以[]像这样输入提示:

([] as any[]).concat(/* omitted */)
Run Code Online (Sandbox Code Playgroud)