let names: (string | string[])[] = ['a', ['b']]
let aaa = names.reduce(result => {
return result
}, [] as string[])
为什么最后 aaa 的类型是 string | string[] 呢?百思不得其解
let names: (string | string[])[] = ['a', ['b']]
let aaa = names.reduce(result => {
return result
}, [] as number[])
用 number 后出来的是期望的 number[],这为什么二者会不一样呢?
1
love OP reduce 的定义:
reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; 看上去没发现问题,心好累。。。 |
2
love OP 这样写可以绕过这个问题
let aaa = names.reduce<string[]>(result => { return result }, []) |
3
agagega 2019-07-10 21:39:39 +08:00
如果把 string | string[] 换成 string | number[] 测试会怎么样?
|
4
Jex 2019-07-27 13:34:32 +08:00 1
因为最为 Generic 的重载 reduce<U>的定义排在最后,你的 initialValue 因为和元素类型兼容,所以被前面的重载抢先匹配了:
reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T; |