TypeScript Version: playground / 3..3.333
Search Terms:
union type, array map
Code
function flattenStringArrays(values: string | string[] | string[][]): string{
if (Array.isArray(values)) {
return values.map(value => flattenStringArrays(value)).join("");
} else {
return values;
}
}
Expected behavior:
here the value in the map expression should be of type string[] | string[][]
Actual behavior:
Compilation error thrown:
Cannot invoke an expression whose type lacks a call signature. Type '((callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[]) | ((callbackfn: (value: string[], index: number, array: string[][]) =>
U, thisArg?: any) => U[])' has no compatible call signatures.
Playground Link:
link
Related Issues:
This is a workaround for the issue:
function flattenStringArrays(values: string | (string | string[])[]): string{
if (Array.isArray(values)) {
return values.map(value => flattenStringArrays(value)).join("");
} else {
return values;
}
}
This issue has been marked as a 'Duplicate' and has seen no recent activity. It has been automatically closed for house-keeping purposes.
Here's a workaround:
/** Type workaround for https://github.com/Microsoft/TypeScript/issues/7294#issuecomment-465794460 */
type ArrayElem<A> = A extends Array<infer Elem> ? Elem : never
export function elemT<T>(array: T): Array<ArrayElem<T>> {
return array as any
}
Example usage:
type A = { x: number, y: string }
type B = { x: number, z: string }
type Subject = A[] | B[]
function foo (items: Subject) {
// items.map(item => item.x) // Type error
elemT(items).map(item => item.x) // Works!
}
Most helpful comment
Here's a workaround:
Example usage: