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>> = () => {