From 4fef8e2c33bceafa814ad41363404b883c48884b Mon Sep 17 00:00:00 2001 From: Oliver Joseph Ash Date: Tue, 21 Jan 2020 15:13:53 +0000 Subject: [PATCH] `react`: `Children` fixes (#41760) * `react`: `Children.map` fixes https://reactjs.org/docs/react-api.html#reactchildren * Refine return type * Apply same changes to `toArray` --- types/react/index.d.ts | 6 ++++-- types/react/test/index.ts | 8 ++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/types/react/index.d.ts b/types/react/index.d.ts index 5528f267ba..2112f615b0 100644 --- a/types/react/index.d.ts +++ b/types/react/index.d.ts @@ -2788,11 +2788,13 @@ declare namespace React { // ---------------------------------------------------------------------- interface ReactChildren { - map(children: C | C[], fn: (child: C, index: number) => T): T[]; + map(children: null, fn: (child: never, index: number) => never): null; + map(children: undefined, fn: (child: never, index: number) => never): undefined; + map(children: C | C[], fn: (child: C, index: number) => T): Array>; forEach(children: C | C[], fn: (child: C, index: number) => void): void; count(children: any): number; only(children: C): C extends any[] ? never : C; - toArray(children: C | C[]): C[]; + toArray(children: ReactNode | ReactNode[]): Array>; } // diff --git a/types/react/test/index.ts b/types/react/test/index.ts index f501e44ce4..4ee1c6caa2 100644 --- a/types/react/test/index.ts +++ b/types/react/test/index.ts @@ -511,7 +511,7 @@ React.Children.forEach(children, (child) => { }); const nChildren: number = React.Children.count(children); let onlyChild: React.ReactElement = React.Children.only(DOM.div()); // ok onlyChild = React.Children.only([null, [[["Hallo"], true]], false]); // error -const childrenToArray: React.ReactChild[] = React.Children.toArray(children); +const childrenToArray: Array> = React.Children.toArray(children); declare const numberChildren: number[]; declare const elementChildren: JSX.Element[]; @@ -519,13 +519,17 @@ declare const mixedChildren: Array; declare const singlePluralChildren: JSX.Element | JSX.Element[]; declare const renderPropsChildren: () => JSX.Element; +// $ExpectType null +const mappedChildrenArray0 = React.Children.map(null, num => num); +// $ExpectType undefined +const mappedChildrenArray1 = React.Children.map(undefined, num => num); // $ExpectType number[] const mappedChildrenArray2 = React.Children.map(numberChildren, num => num); // $ExpectType Element[] const mappedChildrenArray3 = React.Children.map(elementChildren, element => element); // $ExpectType (string | Element)[] const mappedChildrenArray4 = React.Children.map(mixedChildren, elementOrString => elementOrString); -// $ExpectType (string | number | null)[] +// $ExpectType Key[] const mappedChildrenArray5 = React.Children.map(singlePluralChildren, element => element.key); // $ExpectType string[] const mappedChildrenArray6 = React.Children.map(renderPropsChildren, element => element.name);