From d91e71dc060be4aabee9a563d4d532a1f95ad8d1 Mon Sep 17 00:00:00 2001 From: NickBolles Date: Fri, 19 Oct 2018 15:56:46 -0500 Subject: [PATCH 1/4] Fix with-router to not require the router parameter --- types/next-server/router.d.ts | 15 +++++++--- .../test/next-server-router-tests.tsx | 30 +++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/types/next-server/router.d.ts b/types/next-server/router.d.ts index dff4f13a79..2413c6b64b 100644 --- a/types/next-server/router.d.ts +++ b/types/next-server/router.d.ts @@ -82,13 +82,20 @@ export interface WithRouterProps { router: SingletonRouter; } +/** + * Remove properties `K` from `T`. + * + * @internal + */ +export type Omit = T extends any ? Pick> : never; + // Manually disabling the no-unnecessary-generics rule so users can -// retain type inference if they warp their component in withRouter +// retain type inference if they wrap their component in withRouter // without defining props explicitly export function withRouter( - // tslint:disable-next-line:no-unnecessary-generics - Component: React.ComponentType> -): React.ComponentType; + // tslint:disable-next-line:no-unnecessary-generics + Component: React.ComponentType> +): React.ComponentType>>; declare const Router: SingletonRouter; export default Router; diff --git a/types/next-server/test/next-server-router-tests.tsx b/types/next-server/test/next-server-router-tests.tsx index 8b4397baad..5cc3e4ab05 100644 --- a/types/next-server/test/next-server-router-tests.tsx +++ b/types/next-server/test/next-server-router-tests.tsx @@ -97,6 +97,36 @@ class TestComponent extends React.Component { + state = { ready: false }; + + constructor(props: TestComponent2Props) { + super(props); + props.router.ready(() => { + this.setState({ ready: true }); + }); + } + + render() { + return ( +
+

{this.state.ready ? 'Ready' : 'Not Ready'}

+

Route: {this.props.router.route}

+

Another prop: {this.props.testValue}

+
+ ); + } +} + +let TestComponent2WithRouter = withRouter(TestComponent2) +let res = + interface TestSFCQuery { test?: string; } From 98db5e56e0375f56a041ef9605535fbec556c8ea Mon Sep 17 00:00:00 2001 From: NickBolles Date: Fri, 19 Oct 2018 16:10:01 -0500 Subject: [PATCH 2/4] Add a few tests and examples for typing WithRouter better --- .../test/next-server-router-tests.tsx | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/types/next-server/test/next-server-router-tests.tsx b/types/next-server/test/next-server-router-tests.tsx index 5cc3e4ab05..df74fdb353 100644 --- a/types/next-server/test/next-server-router-tests.tsx +++ b/types/next-server/test/next-server-router-tests.tsx @@ -70,14 +70,14 @@ Router.prefetch("/route").then(Component => { const element = ; }); -interface TestComponentProps { +interface TestComponentProps extends WithRouterProps{ testValue: string; } -class TestComponent extends React.Component { +class TestComponent extends React.Component { state = { ready: false }; - constructor(props: TestComponentProps & WithRouterProps) { + constructor(props: TestComponentProps) { super(props); props.router.ready(() => { this.setState({ ready: true }); @@ -131,8 +131,20 @@ interface TestSFCQuery { test?: string; } -interface TestSFCProps extends WithRouterProps { } +interface TestSFCProps extends WithRouterProps { + testProp: string; +} const TestSFC: React.SFC = ({ router }) => { return
{router.query && router.query.test}
; }; +const TestSFCComponent = withRouter(TestSFC) + +let res2 = + + +const TestSFC2 = withRouter(({ router }) => { + return
{router.query && router.query.test}
; +}); + +let res3 = \ No newline at end of file From a6bbbc537eb26592dfdf025fd9afaff42b2e9f71 Mon Sep 17 00:00:00 2001 From: NickBolles Date: Fri, 19 Oct 2018 16:10:01 -0500 Subject: [PATCH 3/4] Add a few tests and examples for typing WithRouter better --- .../test/next-server-router-tests.tsx | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/types/next-server/test/next-server-router-tests.tsx b/types/next-server/test/next-server-router-tests.tsx index 5cc3e4ab05..bac699b4e7 100644 --- a/types/next-server/test/next-server-router-tests.tsx +++ b/types/next-server/test/next-server-router-tests.tsx @@ -70,14 +70,14 @@ Router.prefetch("/route").then(Component => { const element = ; }); -interface TestComponentProps { +interface TestComponentProps extends WithRouterProps { testValue: string; } -class TestComponent extends React.Component { +class TestComponent extends React.Component { state = { ready: false }; - constructor(props: TestComponentProps & WithRouterProps) { + constructor(props: TestComponentProps) { super(props); props.router.ready(() => { this.setState({ ready: true }); @@ -97,12 +97,10 @@ class TestComponent extends React.Component { state = { ready: false }; @@ -124,15 +122,32 @@ class TestComponent2 extends React.Component { } } -let TestComponent2WithRouter = withRouter(TestComponent2) -let res = +const TestComponent2WithRouter = withRouter(TestComponent2); +const res = ; interface TestSFCQuery { test?: string; } -interface TestSFCProps extends WithRouterProps { } +interface TestSFCProps extends WithRouterProps { + testProp: string; +} const TestSFC: React.SFC = ({ router }) => { return
{router.query && router.query.test}
; }; +const TestSFCComponent = withRouter(TestSFC); + +const res2 = ; + +const TestSFC2 = withRouter(({ router }) => { + return
{router.query && router.query.test}
; +}); + +const res3 = ; + +const TestSFC3 = withRouter(({ router }) => { + return
{router.query && router.query.test}
; +}); + +const res4 = ; From 0c6b9cc538de7236d80e0012c120c36d5f359102 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 26 Oct 2018 14:57:36 -0700 Subject: [PATCH 4/4] Remove unnecessary tslint disable --- types/next-server/router.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/types/next-server/router.d.ts b/types/next-server/router.d.ts index 2413c6b64b..190138e3ed 100644 --- a/types/next-server/router.d.ts +++ b/types/next-server/router.d.ts @@ -93,7 +93,6 @@ export type Omit = T extends any ? Pick( - // tslint:disable-next-line:no-unnecessary-generics Component: React.ComponentType> ): React.ComponentType>>;