Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add generic types to RxObservableQuery #30

Merged
merged 3 commits into from
Feb 4, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
### vNEXT

- Add `result()`, `currentResult()`, `variables`, `setOptions`, `setVariables` [PR #29](https://github.com/kamilkisiela/apollo-client-rxjs/pull/29)
- Add generic types to `RxObservableQuery` [PR #30](https://github.com/kamilkisiela/apollo-client-rxjs/pull/30)

### v0.4.1

Expand Down
25 changes: 13 additions & 12 deletions src/RxObservableQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import { ApolloQueryResult, ObservableQuery } from 'apollo-client';

import { ObservableQueryRef } from './utils/ObservableQueryRef';

export class RxObservableQuery<T> extends Observable<T> {
export class RxObservableQuery<T> extends Observable<ApolloQueryResult<T>> {
constructor(
public apollo: ObservableQuery<any> | ObservableQueryRef,
subscribe?: <R>(subscriber: Subscriber<R>) => Subscription | Function | void
subscribe?: <R>(subscriber: Subscriber<R>) => Subscription | Function | void,
) {
super(null);

Expand All @@ -19,7 +19,7 @@ export class RxObservableQuery<T> extends Observable<T> {
}
}

public lift<T, R>(operator: Operator<T, R>): Observable<R> {
public lift<R>(operator: Operator<ApolloQueryResult<T>, ApolloQueryResult<R>>): Observable<ApolloQueryResult<R>> {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is wrong - has broken stuff for me.

Should be something like...

public lift<R>(operator: Operator<ApolloQueryResult<T>, R>): Observable<R> {

Otherwise map etc doesn't work.

I'm currently getting typescript compile errors because of the type mismatch when i use .map

rxObs.map(result => result.data)  // invalid type, as T is not compatible with ApolloQueryResult<T>

See also:

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@armstrjare Could you post a PR?

const observable = new RxObservableQuery<R>(this.apollo);

observable.source = this;
Expand All @@ -30,7 +30,7 @@ export class RxObservableQuery<T> extends Observable<T> {

// apollo-specific methods

public refetch(variables?: any): Promise<ApolloQueryResult<any>> {
public refetch(variables?: any): Promise<ApolloQueryResult<T>> {
return this.getObservableQuery().refetch(variables);
}

Expand All @@ -42,7 +42,7 @@ export class RxObservableQuery<T> extends Observable<T> {
return this.getObservableQuery().startPolling(p);
}

public fetchMore(options: any): Promise<any> {
public fetchMore(options: any): Promise<ApolloQueryResult<T>> {
return this.getObservableQuery().fetchMore(options);
}

Expand All @@ -54,24 +54,25 @@ export class RxObservableQuery<T> extends Observable<T> {
return this.getObservableQuery().subscribeToMore(options);
}

public result(): Promise<ApolloQueryResult<any>> {
public result(): Promise<ApolloQueryResult<T>> {
return this.getObservableQuery().result();
}

public currentResult(): ApolloQueryResult<any> {
// XXX Change it to ApolloCurrentResult
public currentResult(): any {
return this.getObservableQuery().currentResult();
}

public get variables(): any {
public get variables(): { [key: string]: any } {
return this.getObservableQuery().variables;
}

// XXX set ModifiableWatchQueryOptions as an interface of opts
public setOptions(opts: any): Promise<ApolloQueryResult<any>> {
public setOptions(opts: any): Promise<ApolloQueryResult<T>> {
return this.getObservableQuery().setOptions(opts);
}

public setVariables(variables: any, tryFetch: boolean = false): Promise<ApolloQueryResult<any>> {
public setVariables(variables: any, tryFetch: boolean = false): Promise<ApolloQueryResult<T>> {
return this.getObservableQuery().setVariables(variables, tryFetch);
}

Expand All @@ -89,12 +90,12 @@ export class RxObservableQuery<T> extends Observable<T> {
return obs[$$observable]().subscribe(subscriber);
}

private getObservableQuery(): ObservableQuery<any> {
private getObservableQuery(): ObservableQuery<T> {
if (this.apollo instanceof ObservableQueryRef) {
const ref = this.apollo as ObservableQueryRef;
return ref.getRef();
}

return this.apollo as ObservableQuery<any>;
return this.apollo as ObservableQuery<T>;
}
}
6 changes: 3 additions & 3 deletions tests/RxObservableQuery.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { assert } from 'chai';
import { spy, stub } from 'sinon';
import { ApolloClient, ApolloQueryResult, ObservableQuery } from 'apollo-client';
import { ApolloClient, ObservableQuery } from 'apollo-client';

import * as heroes from './fixtures/heroes';
import { RxObservableQuery } from '../src/RxObservableQuery';
Expand All @@ -10,8 +10,8 @@ import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';

describe('RxObservableQuery', () => {
let obsQuery: ObservableQuery<any>;
let rxObsQuery: RxObservableQuery<ApolloQueryResult<any>>;
let obsQuery: ObservableQuery<heroes.AllHeroesQueryResult>;
let rxObsQuery: RxObservableQuery<heroes.AllHeroesQueryResult>;
let client: ApolloClient;

beforeEach(() => {
Expand Down
20 changes: 15 additions & 5 deletions tests/fixtures/heroes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { DocumentNode } from 'graphql';
import { ApolloClient, ApolloQueryResult, ObservableQuery } from 'apollo-client';
import { ApolloClient, ObservableQuery } from 'apollo-client';

import { RxObservableQuery } from '../../src/RxObservableQuery';
import { RxApolloClient } from '../../src/RxApolloClient';
Expand All @@ -10,6 +10,16 @@ import mockNetworkInterface from '../mocks/mockNetworkInterface';

// data

export interface Hero {
name: string;
}

export interface AllHeroesQueryResult {
allHeroes: {
heroes: Hero[];
};
}

export const query: DocumentNode = gql`
query heroes {
allHeroes {
Expand Down Expand Up @@ -46,15 +56,15 @@ export const variables = { hero: 'Mr Bar' };
export interface MockedClientResult {
client: ApolloClient;
obsQuery: ObservableQuery<any>;
rxObsQuery: RxObservableQuery<ApolloQueryResult<any>>;
rxObsQuery: RxObservableQuery<any>;
}

export function mockClient(): MockedClientResult {
const networkInterface = createNetworkInterface();

const client = new ApolloClient({ networkInterface, addTypename: false });
const obsQuery = client.watchQuery({ query });
const rxObsQuery = new RxObservableQuery(obsQuery);
const obsQuery = client.watchQuery<AllHeroesQueryResult>({ query });
const rxObsQuery = new RxObservableQuery<AllHeroesQueryResult>(obsQuery);

return {
client,
Expand All @@ -72,7 +82,7 @@ export function mockRxClient(): MockedRxClientResult {

const client = new RxApolloClient({ networkInterface, addTypename: false });
const obsQuery = client.watchQuery({ query });
const rxObsQuery = new RxObservableQuery(obsQuery);
const rxObsQuery = new RxObservableQuery<AllHeroesQueryResult>(obsQuery);

return {
client,
Expand Down