Skip to content

Commit 4ec4ff1

Browse files
imcottonbenlesh
authored andcommittedAug 6, 2018
fix(distinctUntilKeyChanged): improved key typing with keyof T (#3988)
* fix(distinctUntilKeyChanged): correct signatures * chore(distinctUntilKeyChanged): nail down key's typing with keyof T
1 parent 1f056f5 commit 4ec4ff1

File tree

4 files changed

+32
-11
lines changed

4 files changed

+32
-11
lines changed
 

‎compat/operator/distinctUntilKeyChanged.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import { Observable } from 'rxjs';
33
import { distinctUntilKeyChanged as higherOrder } from 'rxjs/operators';
44

55
/* tslint:disable:max-line-length */
6-
export function distinctUntilKeyChanged<T>(this: Observable<T>, key: string): Observable<T>;
7-
export function distinctUntilKeyChanged<T, K>(this: Observable<T>, key: string, compare: (x: K, y: K) => boolean): Observable<T>;
6+
export function distinctUntilKeyChanged<T>(this: Observable<T>, key: keyof T): Observable<T>;
7+
export function distinctUntilKeyChanged<T, K extends keyof T>(this: Observable<T>, key: K, compare: (x: T[K], y: T[K]) => boolean): Observable<T>;
88
/* tslint:enable:max-line-length */
99

1010
/**
@@ -64,6 +64,7 @@ export function distinctUntilKeyChanged<T, K>(this: Observable<T>, key: string,
6464
* @method distinctUntilKeyChanged
6565
* @owner Observable
6666
*/
67-
export function distinctUntilKeyChanged<T>(this: Observable<T>, key: string, compare?: (x: T, y: T) => boolean): Observable<T> {
68-
return higherOrder<T, T>(key, compare)(this);
67+
// tslint:disable-next-line:max-line-length
68+
export function distinctUntilKeyChanged<T, K extends keyof T>(this: Observable<T>, key: K, compare?: (x: T[K], y: T[K]) => boolean): Observable<T> {
69+
return higherOrder<T, K>(key, compare)(this);
6970
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { of } from 'rxjs';
2+
import { distinctUntilKeyChanged } from 'rxjs/operators';
3+
4+
const sample = {name: 'foobar', num: 42};
5+
6+
it('should enforce key set', () => {
7+
const o = of(sample).pipe(distinctUntilKeyChanged('something')); // $ExpectError
8+
});
9+
10+
it('should enforce key set with compare', () => {
11+
const o = of(sample).pipe(distinctUntilKeyChanged('something', () => true)); // $ExpectError
12+
});
13+
14+
it("should enforce compare's type", () => {
15+
const o = of(sample).pipe(distinctUntilKeyChanged('name', (a: number, b: number) => true)); // $ExpectError
16+
});
17+
18+
it("should enforce key set and compare's type", () => {
19+
const o = of(sample).pipe(distinctUntilKeyChanged('something', (a: number, b: number) => true)); // $ExpectError
20+
});

‎spec/operators/distinctUntilKeyChanged-spec.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ describe('distinctUntilKeyChanged operator', () => {
185185
const e1subs = '^ !';
186186
const expected = '--a--------------|';
187187

188-
expectObservable((<any>e1).pipe(distinctUntilKeyChanged('val', () => true))).toBe(expected, values);
188+
expectObservable(e1.pipe(distinctUntilKeyChanged('val', () => true))).toBe(expected, values);
189189
expectSubscriptions(e1.subscriptions).toBe(e1subs);
190190
});
191191

@@ -195,7 +195,7 @@ describe('distinctUntilKeyChanged operator', () => {
195195
const e1subs = '^ !';
196196
const expected = '--a--a--a--a--a--a--|';
197197

198-
expectObservable((<any>e1).pipe(distinctUntilKeyChanged('val', () => false))).toBe(expected, values);
198+
expectObservable(e1.pipe(distinctUntilKeyChanged('val', () => false))).toBe(expected, values);
199199
expectSubscriptions(e1.subscriptions).toBe(e1subs);
200200
});
201201

@@ -206,7 +206,7 @@ describe('distinctUntilKeyChanged operator', () => {
206206
const expected = '--a-----c-----e--|';
207207
const selector = (x: number, y: number) => y % 2 === 0;
208208

209-
expectObservable((<any>e1).pipe(distinctUntilKeyChanged('val', selector))).toBe(expected, values);
209+
expectObservable(e1.pipe(distinctUntilKeyChanged('val', selector))).toBe(expected, values);
210210
expectSubscriptions(e1.subscriptions).toBe(e1subs);
211211
});
212212

@@ -222,7 +222,7 @@ describe('distinctUntilKeyChanged operator', () => {
222222
return x === y;
223223
};
224224

225-
expectObservable((<any>e1).pipe(distinctUntilKeyChanged('val', selector))).toBe(expected, values);
225+
expectObservable(e1.pipe(distinctUntilKeyChanged('val', selector))).toBe(expected, values);
226226
expectSubscriptions(e1.subscriptions).toBe(e1subs);
227227
});
228228
});

‎src/internal/operators/distinctUntilKeyChanged.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { distinctUntilChanged } from './distinctUntilChanged';
22
import { MonoTypeOperatorFunction } from '../types';
33

44
/* tslint:disable:max-line-length */
5-
export function distinctUntilKeyChanged<T>(key: string): MonoTypeOperatorFunction<T>;
6-
export function distinctUntilKeyChanged<T, K>(key: string, compare: (x: K, y: K) => boolean): MonoTypeOperatorFunction<T>;
5+
export function distinctUntilKeyChanged<T>(key: keyof T): MonoTypeOperatorFunction<T>;
6+
export function distinctUntilKeyChanged<T, K extends keyof T>(key: K, compare: (x: T[K], y: T[K]) => boolean): MonoTypeOperatorFunction<T>;
77
/* tslint:enable:max-line-length */
88

99
/**
@@ -70,6 +70,6 @@ export function distinctUntilKeyChanged<T, K>(key: string, compare: (x: K, y: K)
7070
* @method distinctUntilKeyChanged
7171
* @owner Observable
7272
*/
73-
export function distinctUntilKeyChanged<T>(key: string, compare?: (x: T, y: T) => boolean): MonoTypeOperatorFunction<T> {
73+
export function distinctUntilKeyChanged<T, K extends keyof T>(key: K, compare?: (x: T[K], y: T[K]) => boolean): MonoTypeOperatorFunction<T> {
7474
return distinctUntilChanged((x: T, y: T) => compare ? compare(x[key], y[key]) : x[key] === y[key]);
7575
}

0 commit comments

Comments
 (0)
Please sign in to comment.