diff --git a/types/react/index.d.ts b/types/react/index.d.ts index b766eee600..123bf15d02 100644 --- a/types/react/index.d.ts +++ b/types/react/index.d.ts @@ -278,7 +278,7 @@ declare namespace React { // Base component for plain JS classes // tslint:disable-next-line:no-empty-interface - interface Component

extends ComponentLifecycle { } + interface Component

extends ComponentLifecycle { } class Component { constructor(props: P, context?: any); @@ -306,7 +306,7 @@ declare namespace React { }; } - class PureComponent

extends Component { } + class PureComponent

extends Component { } interface ClassicComponent

extends Component { replaceState(nextState: S, callback?: () => void): void; diff --git a/types/react/test/index.ts b/types/react/test/index.ts index 6dae0cbe3c..64d1b20955 100644 --- a/types/react/test/index.ts +++ b/types/react/test/index.ts @@ -25,6 +25,10 @@ interface State { seconds?: number; } +interface Snapshot { + baz: string; +} + interface Context { someValue?: string; } @@ -51,7 +55,7 @@ declare const container: Element; // Top-Level API // -------------------------------------------------------------------------- -class ModernComponent extends React.Component +class ModernComponent extends React.Component implements MyComponent, React.ChildContextProvider { static propTypes: React.ValidationMap = { foo: PropTypes.number @@ -103,6 +107,14 @@ class ModernComponent extends React.Component shouldComponentUpdate(nextProps: Props, nextState: State, nextContext: any): boolean { return shallowCompare(this, nextProps, nextState); } + + getSnapshotBeforeUpdate(prevProps: Readonly) { + return { baz: `${prevProps.foo}baz` }; + } + + componentDidUpdate(prevProps: Readonly, prevState: Readonly, snapshot: Snapshot) { + return; + } } class ModernComponentArrayRender extends React.Component { diff --git a/types/react/test/tsx.tsx b/types/react/test/tsx.tsx index dca7a1f814..431cef2fa0 100644 --- a/types/react/test/tsx.tsx +++ b/types/react/test/tsx.tsx @@ -153,6 +153,26 @@ class ComponentWithNewLifecycles extends React.Component; + +class PureComponentWithNewLifecycles extends React.PureComponent { + static getDerivedStateFromProps: React.GetDerivedStateFromProps = (nextProps) => { + return { bar: `${nextProps.foo}bar` }; + } + + getSnapshotBeforeUpdate(prevProps: Readonly) { + return { baz: `${prevProps.foo}baz` }; + } + + componentDidUpdate(prevProps: Readonly, prevState: Readonly, snapshot: { baz: string }) { + return; + } + + render() { + return this.state.bar; + } +} +; class ComponentWithLargeState extends React.Component<{}, Record<'a'|'b'|'c', string>> { static getDerivedStateFromProps: React.GetDerivedStateFromProps<{}, Record<'a'|'b'|'c', string>> = () => {