From cdab315a76d2027a8f671ca65a70b2c4399da16c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eloy=20Dur=C3=A1n?= Date: Sat, 25 Aug 2018 10:01:14 +0200 Subject: [PATCH] [react-relay] Add generics to QueryRenderer to type variables and response. --- types/react-relay/index.d.ts | 28 ++++++++++++-------- types/react-relay/test/react-relay-tests.tsx | 21 +++++++++++---- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/types/react-relay/index.d.ts b/types/react-relay/index.d.ts index 2e41dcbd6a..69c417b7ec 100644 --- a/types/react-relay/index.d.ts +++ b/types/react-relay/index.d.ts @@ -7,7 +7,7 @@ // Cameron Knight // Kaare Hoff Skovgaard // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -// TypeScript Version: 2.8 +// TypeScript Version: 2.9 // Prettified with: // $ prettier --parser typescript --tab-width 4 --semi --trailing-comma es5 --write --print-width 120 \ @@ -88,24 +88,30 @@ export const graphql: GraphqlInterface; // ~~~~~~~~~~~~~~~~~~~~~ // ReactRelayQueryRenderer // ~~~~~~~~~~~~~~~~~~~~~ -export interface QueryRendererProps { + +export type QueryRendererGenerics = { variables: object; response: object }; + +export interface QueryRendererProps { cacheConfig?: RelayRuntimeTypes.CacheConfig; environment: RelayRuntimeTypes.Environment; query?: RelayRuntimeTypes.GraphQLTaggedNode | null; - render(readyState: ReadyState): React.ReactElement | undefined | null; - variables: RelayRuntimeTypes.Variables; + render(readyState: ReadyState): React.ReactElement | undefined | null; + variables: T["variables"]; rerunParamExperimental?: RelayRuntimeTypes.RerunParam; } -export interface ReadyState { +export interface ReadyState { error: Error | undefined | null; - props: { [propName: string]: any } | undefined | null; + props: T | undefined | null; retry?(): void; } -export interface QueryRendererState { - readyState: ReadyState; -} -export class ReactRelayQueryRenderer extends React.Component {} -export class QueryRenderer extends ReactRelayQueryRenderer {} + +export class ReactRelayQueryRenderer extends React.Component> {} +export class QueryRenderer< + T extends QueryRendererGenerics = { + variables: RelayRuntimeTypes.Variables; + response: { [propName: string]: any }; + } +> extends ReactRelayQueryRenderer {} // ~~~~~~~~~~~~~~~~~~~~~ // createFragmentContainer diff --git a/types/react-relay/test/react-relay-tests.tsx b/types/react-relay/test/react-relay-tests.tsx index 9d08ed42d6..9f704bb042 100644 --- a/types/react-relay/test/react-relay-tests.tsx +++ b/types/react-relay/test/react-relay-tests.tsx @@ -1,3 +1,5 @@ +// tslint:disable:interface-over-type-literal + import * as React from "react"; import { Environment, Network, RecordSource, Store, ConnectionHandler, FragmentReference } from "relay-runtime"; @@ -28,8 +30,21 @@ const modernEnvironment = new Environment({ network, store }); // ~~~~~~~~~~~~~~~~~~~~~ // Modern QueryRenderer // ~~~~~~~~~~~~~~~~~~~~~ + +// Artifact produced by relay-compiler-language-typescript +type MyQueryRendererVariables = { + pageID: string; +}; +type MyQueryRendererResponse = { + name: string; +}; +type MyQueryRenderer = { + variables: MyQueryRendererVariables; + response: MyQueryRendererResponse; +}; + const MyQueryRenderer = (props: { name: string; show: boolean }) => ( - environment={modernEnvironment} query={ props.show @@ -82,7 +97,6 @@ type StoryLike = (storyID: string) => void; // Artifact produced by relay-compiler-language-typescript declare const _Story_story$ref: unique symbol; type Story_story$ref = typeof _Story_story$ref; -// tslint:disable-next-line:interface-over-type-literal type Story_story = { readonly id: string; readonly text: string; @@ -173,7 +187,6 @@ declare const _FeedStories_feed$ref: unique symbol; type FeedStories_feed$ref = typeof _FeedStories_feed$ref; declare const _FeedStory_edges$ref: unique symbol; type FeedStory_edges$ref = typeof _FeedStory_edges$ref; -// tslint:disable-next-line:interface-over-type-literal type FeedStories_feed = { readonly edges: ReadonlyArray<{ readonly node: { @@ -184,7 +197,6 @@ type FeedStories_feed = { }>; readonly " $refType": FeedStories_feed$ref; }; -// tslint:disable-next-line:interface-over-type-literal type FeedStory_edges = ReadonlyArray<{ readonly publishedAt: string; readonly " $refType": FeedStory_edges$ref; @@ -255,7 +267,6 @@ const Feed = (() => { // Artifact produced by relay-compiler-language-typescript declare const _UserFeed_user$ref: unique symbol; type UserFeed_user$ref = typeof _UserFeed_user$ref; -// tslint:disable-next-line:interface-over-type-literal type UserFeed_user = { readonly feed: { readonly pageInfo: {