Skip to content

Commit c2efa3a

Browse files
committed
Use direct imports of react where possible.
TypeScript still requires "import * as React from 'react'" if JSX components are declared.
1 parent 821ce2a commit c2efa3a

File tree

5 files changed

+38
-35
lines changed

5 files changed

+38
-35
lines changed

src/components/Context.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import * as React from 'react'
1+
import { createContext } from 'react'
22
import type { Action, AnyAction, Store } from 'redux'
33
import type { Subscription } from '../utils/Subscription'
44

@@ -12,7 +12,7 @@ export interface ReactReduxContextValue<
1212
}
1313

1414
export const ReactReduxContext =
15-
/*#__PURE__*/ React.createContext<ReactReduxContextValue>(null as any)
15+
/*#__PURE__*/ createContext<ReactReduxContextValue>(null as any)
1616

1717
export type ReactReduxContextInstance = typeof ReactReduxContext
1818

test/components/Provider.spec.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
/*eslint-disable react/prop-types*/
22

33
import * as React from 'react'
4-
import { Component, Dispatch } from 'react'
5-
import * as ReactDOM from 'react-dom'
4+
import { Component, Dispatch, StrictMode } from 'react'
5+
import { render, unmountComponentAtNode } from 'react-dom'
66
import { createStore } from 'redux'
77
import { Provider, connect, ReactReduxContext } from '../../src/index'
88
import * as rtl from '@testing-library/react'
@@ -312,18 +312,18 @@ describe('React', () => {
312312
})
313313

314314
it('works in <StrictMode> without warnings (React 16.3+)', () => {
315-
if (!React.StrictMode) {
315+
if (!StrictMode) {
316316
return
317317
}
318318
const spy = jest.spyOn(console, 'error').mockImplementation(() => {})
319319
const store = createStore(() => ({}))
320320

321321
rtl.render(
322-
<React.StrictMode>
322+
<StrictMode>
323323
<Provider store={store}>
324324
<div />
325325
</Provider>
326-
</React.StrictMode>
326+
</StrictMode>
327327
)
328328

329329
expect(spy).not.toHaveBeenCalled()
@@ -344,15 +344,15 @@ describe('React', () => {
344344
}
345345

346346
const div = document.createElement('div')
347-
ReactDOM.render(
347+
render(
348348
<Provider store={store}>
349349
<div />
350350
</Provider>,
351351
div
352352
)
353353

354354
expect(spy).toHaveBeenCalledTimes(0)
355-
ReactDOM.unmountComponentAtNode(div)
355+
unmountComponentAtNode(div)
356356
expect(spy).toHaveBeenCalledTimes(1)
357357
})
358358

test/components/hooks.spec.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
/*eslint-disable react/prop-types*/
22

33
import * as React from 'react'
4+
import { useState, useEffect, version as reactVersion } from 'react'
45
import { createStore } from 'redux'
56
import { Provider as ProviderMock, connect } from '../../src/index'
67
import * as rtl from '@testing-library/react'
78
import '@testing-library/jest-dom/extend-expect'
89
import type { AnyAction } from 'redux'
910

10-
const IS_REACT_18 = React.version.startsWith('18')
11+
const IS_REACT_18 = reactVersion.startsWith('18')
1112

1213
describe('React', () => {
1314
describe('connect', () => {
@@ -61,11 +62,11 @@ describe('React', () => {
6162
})
6263

6364
const component1 = (props: Omit<RootStateType, 'byId'>) => {
64-
const [state, setState] = React.useState({ list: props.list })
65+
const [state, setState] = useState({ list: props.list })
6566

6667
component1StateList = state.list
6768

68-
React.useEffect(() => {
69+
useEffect(() => {
6970
setState((prevState) => ({ ...prevState, list: props.list }))
7071
}, [props.list])
7172

test/integration/dynamic-reducers.spec.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
/*eslint-disable react/prop-types*/
22

33
import * as React from 'react'
4-
import * as ReactDOMServer from 'react-dom/server'
4+
import { createContext } from 'react'
5+
import { renderToString } from 'react-dom/server'
56
import { createStore, combineReducers } from 'redux'
67
import { connect, Provider, ReactReduxContext } from '../../src/index'
78
import * as rtl from '@testing-library/react'
@@ -29,9 +30,7 @@ describe('React', () => {
2930
because it's the popular approach, this test targets nr 3.
3031
*/
3132
describe('dynamic reducers', () => {
32-
const InjectReducersContext = React.createContext<
33-
((r: any) => void) | null
34-
>(null)
33+
const InjectReducersContext = createContext<((r: any) => void) | null>(null)
3534

3635
type Reducer = (s: any) => any
3736

@@ -185,7 +184,7 @@ describe('React', () => {
185184
// @ts-ignore
186185
console.error.mockImplementation(() => {})
187186

188-
const markup = ReactDOMServer.renderToString(
187+
const markup = renderToString(
189188
<Provider store={store}>
190189
<InjectReducersContext.Provider value={injectReducers}>
191190
<InitialGreeting />

test/typetests/react-redux-types.typetest.tsx

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
/* eslint-disable @typescript-eslint/no-unused-vars, no-inner-declarations */
2-
import { Component, ReactElement } from 'react'
2+
import {
3+
createElement,
4+
Component,
5+
ComponentType,
6+
ReactElement,
7+
ReactNode,
8+
} from 'react'
39
import * as React from 'react'
4-
import * as ReactDOM from 'react-dom'
10+
import { render } from 'react-dom'
511
import {
612
configureStore,
713
createSlice,
@@ -91,15 +97,15 @@ connect<ICounterStateProps, ICounterDispatchProps, {}, {}, CounterState>(
9197
)(Counter)
9298

9399
class App extends Component<any, any> {
94-
render(): React.ReactNode {
100+
render(): ReactNode {
95101
// ...
96102
return null
97103
}
98104
}
99105

100106
const targetEl = document.getElementById('root')
101107

102-
ReactDOM.render(
108+
render(
103109
<Provider store={store}>
104110
<App />
105111
</Provider>,
@@ -129,7 +135,7 @@ type AddTodoAction = ReturnType<typeof addTodo>
129135
declare var todoActionCreators: { [type: string]: (...args: any[]) => any }
130136
declare var counterActionCreators: { [type: string]: (...args: any[]) => any }
131137

132-
ReactDOM.render(
138+
render(
133139
<Provider store={store}>
134140
<MyRootComponent />
135141
</Provider>,
@@ -246,7 +252,7 @@ class TestComponent extends Component<TestProp, TestState> {}
246252
const WrappedTestComponent = connect()(TestComponent)
247253

248254
// return value of the connect()(TestComponent) is of the type TestComponent
249-
let ATestComponent: React.ComponentType<TestProp>
255+
let ATestComponent: ComponentType<TestProp>
250256
ATestComponent = TestComponent
251257
ATestComponent = WrappedTestComponent
252258

@@ -271,11 +277,8 @@ function HelloMessage(props: HelloMessageProps) {
271277
return <div>Hello {props.name}</div>
272278
}
273279
let ConnectedHelloMessage = connect()(HelloMessage)
274-
ReactDOM.render(
275-
<HelloMessage name="Sebastian" />,
276-
document.getElementById('content')
277-
)
278-
ReactDOM.render(
280+
render(<HelloMessage name="Sebastian" />, document.getElementById('content'))
281+
render(
279282
<ConnectedHelloMessage name="Sebastian" />,
280283
document.getElementById('content')
281284
)
@@ -324,7 +327,7 @@ namespace TestTOwnPropsInference {
324327
state: string
325328
}
326329

327-
class OwnPropsComponent extends React.Component<OwnProps & StateProps, {}> {
330+
class OwnPropsComponent extends Component<OwnProps & StateProps, {}> {
328331
render() {
329332
return <div />
330333
}
@@ -352,28 +355,28 @@ namespace TestTOwnPropsInference {
352355
)(OwnPropsComponent)
353356

354357
// @ts-expect-error
355-
React.createElement(ConnectedWithoutOwnProps, { anything: 'goes!' })
358+
createElement(ConnectedWithoutOwnProps, { anything: 'goes!' })
356359

357360
// This compiles, as expected.
358-
React.createElement(ConnectedWithOwnProps, { own: 'string' })
361+
createElement(ConnectedWithOwnProps, { own: 'string' })
359362

360363
// This should not compile, which is good.
361364
// @ts-expect-error
362-
React.createElement(ConnectedWithOwnProps, { missingOwn: true })
365+
createElement(ConnectedWithOwnProps, { missingOwn: true })
363366

364367
// This compiles, as expected.
365-
React.createElement(ConnectedWithTypeHint, { own: 'string' })
368+
createElement(ConnectedWithTypeHint, { own: 'string' })
366369

367370
// This should not compile, which is good.
368371
// @ts-expect-error
369-
React.createElement(ConnectedWithTypeHint, { missingOwn: true })
372+
createElement(ConnectedWithTypeHint, { missingOwn: true })
370373

371374
interface AllProps {
372375
own: string
373376
state: string
374377
}
375378

376-
class AllPropsComponent extends React.Component<AllProps & DispatchProp> {
379+
class AllPropsComponent extends Component<AllProps & DispatchProp> {
377380
render() {
378381
return <div />
379382
}

0 commit comments

Comments
 (0)