Extract pipeable operator as generic function in RXJS

49 views Asked by At

How to extract the following pipe operator to a generic function

.pipe(map((products: IProduct[]) => products.map((product: IProduct) => product.title)));

Compare to this answer I tried a generic variant:

static mapPropertiesToArray<T extends object>( property: string ){
    return pipe(map((objects: T[]) => objects.map((item: T) => item[property as keyof T])));
}
1

There are 1 answers

5
Tim Nyborg On BEST ANSWER

Rather than casting property, define it as a key of T. Also, pipe() is unnecessary since you're not combining operators:

function mapPropertiesToArray<T>(property: keyof T) {
  return map((objects: T[]) => objects.map((item: T) => item[property]));
}

This ensures a use like of(myArray).pipe(mapPropertiesToArray('title')) throws an error if title isn't a valid attribute

Edit: your comment made me realize this would return a union type if T's keys' values have differing types. We need slightly more precise typing:

function mapPropertiesToArray<T, P extends keyof T>(property: P) {
  return map((objects: T[]) => objects.map(item => item[property]));
}