Skip to content

Commit 4ec4ff1

Browse files
imcottonbenlesh
authored andcommitted
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

4 files changed

Lines changed: 32 additions & 11 deletions

File tree

‎compat/operator/distinctUntilKeyChanged.ts‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import { Observable } from 'rxjs';
33
import{distinctUntilKeyChangedashigherOrder}from'rxjs/operators';
44

55
/* tslint:disable:max-line-length */
6-
exportfunctiondistinctUntilKeyChanged<T>(this: Observable<T>,key: string): Observable<T>;
7-
exportfunctiondistinctUntilKeyChanged<T,K>(this: Observable<T>,key: string,compare: (x: K,y: K)=>boolean): Observable<T>;
6+
exportfunctiondistinctUntilKeyChanged<T>(this: Observable<T>,key: keyofT): Observable<T>;
7+
exportfunctiondistinctUntilKeyChanged<T,KextendskeyofT>(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-
exportfunctiondistinctUntilKeyChanged<T>(this: Observable<T>,key: string,compare?: (x: T,y: T)=>boolean): Observable<T>{
68-
returnhigherOrder<T,T>(key,compare)(this);
67+
// tslint:disable-next-line:max-line-length
68+
exportfunctiondistinctUntilKeyChanged<T,KextendskeyofT>(this: Observable<T>,key: K,compare?: (x: T[K],y: T[K])=>boolean): Observable<T>{
69+
returnhigherOrder<T,K>(key,compare)(this);
6970
}
Lines changed: 20 additions & 0 deletions
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+
constsample={name: 'foobar',num: 42};
5+
6+
it('should enforce key set',()=>{
7+
consto=of(sample).pipe(distinctUntilKeyChanged('something'));// $ExpectError
8+
});
9+
10+
it('should enforce key set with compare',()=>{
11+
consto=of(sample).pipe(distinctUntilKeyChanged('something',()=>true));// $ExpectError
12+
});
13+
14+
it("should enforce compare's type",()=>{
15+
consto=of(sample).pipe(distinctUntilKeyChanged('name',(a: number,b: number)=>true));// $ExpectError
16+
});
17+
18+
it("should enforce key set and compare's type",()=>{
19+
consto=of(sample).pipe(distinctUntilKeyChanged('something',(a: number,b: number)=>true));// $ExpectError
20+
});

‎spec/operators/distinctUntilKeyChanged-spec.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ describe('distinctUntilKeyChanged operator', () => {
185185
conste1subs='^ !';
186186
constexpected='--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
conste1subs='^ !';
196196
constexpected='--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
constexpected='--a-----c-----e--|';
207207
constselector=(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
returnx===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‎

Lines changed: 3 additions & 3 deletions
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-
exportfunctiondistinctUntilKeyChanged<T>(key: string): MonoTypeOperatorFunction<T>;
6-
exportfunctiondistinctUntilKeyChanged<T,K>(key: string,compare: (x: K,y: K)=>boolean): MonoTypeOperatorFunction<T>;
5+
exportfunctiondistinctUntilKeyChanged<T>(key: keyofT): MonoTypeOperatorFunction<T>;
6+
exportfunctiondistinctUntilKeyChanged<T,KextendskeyofT>(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-
exportfunctiondistinctUntilKeyChanged<T>(key: string,compare?: (x: T,y: T)=>boolean): MonoTypeOperatorFunction<T>{
73+
exportfunctiondistinctUntilKeyChanged<T,KextendskeyofT>(key: K,compare?: (x: T[K],y: T[K])=>boolean): MonoTypeOperatorFunction<T>{
7474
returndistinctUntilChanged((x: T,y: T)=>compare ? compare(x[key],y[key]) : x[key]===y[key]);
7575
}

0 commit comments

Comments
 (0)