From 4744c229dbd372746a38ebbcdae2245f945ebcc4 Mon Sep 17 00:00:00 2001 From: Andrea Canciani Date: Fri, 27 Mar 2020 11:51:17 +0100 Subject: [PATCH] fix(common): correct typing and implementation of `SlicePipe` (#37447) Even in the overloads, state that it can accept `null` and `undefined`, in order to ensure easy composition with `async`. Additionally, change the implementation to return `null` on an `undefined` input, for consistency with other pipes. BREAKING CHANGE: The `slice` pipe now returns `null` for the `undefined` input value, which is consistent with the behavior of most pipes. If you rely on `undefined` being the result in that case, you now need to check for it explicitly. PR Close #37447 --- goldens/public-api/common/common.d.ts | 5 +++-- packages/common/src/pipes/slice_pipe.ts | 10 ++++++---- packages/common/test/pipes/slice_pipe_spec.ts | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/goldens/public-api/common/common.d.ts b/goldens/public-api/common/common.d.ts index 89ac6ad48e..647fd3f2f9 100644 --- a/goldens/public-api/common/common.d.ts +++ b/goldens/public-api/common/common.d.ts @@ -381,9 +381,10 @@ export declare function registerLocaleData(data: any, localeId?: string | any, e export declare class SlicePipe implements PipeTransform { transform(value: ReadonlyArray, start: number, end?: number): Array; + transform(value: null | undefined, start: number, end?: number): null; + transform(value: ReadonlyArray | null | undefined, start: number, end?: number): Array | null; transform(value: string, start: number, end?: number): string; - transform(value: null, start: number, end?: number): null; - transform(value: undefined, start: number, end?: number): undefined; + transform(value: string | null | undefined, start: number, end?: number): string | null; } export declare type Time = { diff --git a/packages/common/src/pipes/slice_pipe.ts b/packages/common/src/pipes/slice_pipe.ts index 07e6ba4014..90bf602f92 100644 --- a/packages/common/src/pipes/slice_pipe.ts +++ b/packages/common/src/pipes/slice_pipe.ts @@ -62,11 +62,13 @@ export class SlicePipe implements PipeTransform { * - **if negative**: return all items before `end` index from the end of the list or string. */ transform(value: ReadonlyArray, start: number, end?: number): Array; + transform(value: null|undefined, start: number, end?: number): null; + transform(value: ReadonlyArray|null|undefined, start: number, end?: number): Array|null; transform(value: string, start: number, end?: number): string; - transform(value: null, start: number, end?: number): null; - transform(value: undefined, start: number, end?: number): undefined; - transform(value: any, start: number, end?: number): any { - if (value == null) return value; + transform(value: string|null|undefined, start: number, end?: number): string|null; + transform(value: ReadonlyArray|string|null|undefined, start: number, end?: number): + Array|string|null { + if (value == null) return null; if (!this.supports(value)) { throw invalidPipeArgumentError(SlicePipe, value); diff --git a/packages/common/test/pipes/slice_pipe_spec.ts b/packages/common/test/pipes/slice_pipe_spec.ts index 1ab7398c4d..c0172e6278 100644 --- a/packages/common/test/pipes/slice_pipe_spec.ts +++ b/packages/common/test/pipes/slice_pipe_spec.ts @@ -47,8 +47,8 @@ import {expect} from '@angular/platform-browser/testing/src/matchers'; expect(pipe.transform(null, 1)).toBe(null); }); - it('should return undefined if the value is undefined', () => { - expect(pipe.transform(undefined, 1)).toBe(undefined); + it('should return null if the value is undefined', () => { + expect(pipe.transform(undefined, 1)).toBe(null); }); it('should return all items after START index when START is positive and END is omitted',