From d248e86bc27285427397e498b3f8e3edef7e2d45 Mon Sep 17 00:00:00 2001 From: harris-miller Date: Thu, 25 May 2023 02:50:37 -0600 Subject: [PATCH 1/5] better types for pluck --- types/pluck.d.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/types/pluck.d.ts b/types/pluck.d.ts index 934afa2e..6074edc9 100644 --- a/types/pluck.d.ts +++ b/types/pluck.d.ts @@ -1,4 +1,5 @@ -export function pluck

(p: P): (list: Array>) => T[]; -export function pluck(p: number): (list: Array<{ [k: number]: T }>) => T[]; -export function pluck(p: K, list: readonly T[]): Array; -export function pluck(p: number, list: Array<{ [k: number]: T }>): T[]; +import { Placeholder } from 'ramda'; + +export function pluck(prop: K extends Placeholder ? never : K): >(list: U[]) => Array; +export function pluck(__: Placeholder, list: U[]): () => Array; +export function pluck(p: K, list: readonly U[]): Array; From 51b287c4bd473e95d4b491eef6ebaba4bf2e639c Mon Sep 17 00:00:00 2001 From: harris-miller Date: Thu, 25 May 2023 03:26:03 -0600 Subject: [PATCH 2/5] that's better --- types/pluck.d.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/types/pluck.d.ts b/types/pluck.d.ts index 6074edc9..91023fec 100644 --- a/types/pluck.d.ts +++ b/types/pluck.d.ts @@ -1,5 +1,7 @@ import { Placeholder } from 'ramda'; -export function pluck(prop: K extends Placeholder ? never : K): >(list: U[]) => Array; -export function pluck(__: Placeholder, list: U[]): () => Array; -export function pluck(p: K, list: readonly U[]): Array; +export function pluck(prop: K extends Placeholder ? never : K): { + >(list: U[]): U extends (infer T)[] ? T[] : U extends Record ? T[] : never; +}; +export function pluck(__: Placeholder, list: readonly U[]): (prop: K) => Array; +export function pluck(prop: K, list: readonly U[]): Array; From 2f527b9813dd3c6d94e6ed823d8c77e3ae03e37d Mon Sep 17 00:00:00 2001 From: harris-miller Date: Thu, 25 May 2023 03:29:24 -0600 Subject: [PATCH 3/5] don't forget the readonlys --- types/pluck.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/pluck.d.ts b/types/pluck.d.ts index 91023fec..5104eb07 100644 --- a/types/pluck.d.ts +++ b/types/pluck.d.ts @@ -1,7 +1,7 @@ import { Placeholder } from 'ramda'; export function pluck(prop: K extends Placeholder ? never : K): { - >(list: U[]): U extends (infer T)[] ? T[] : U extends Record ? T[] : never; + >(list: U[]): U extends readonly (infer T)[] ? T[] : U extends Record ? T[] : never; }; export function pluck(__: Placeholder, list: readonly U[]): (prop: K) => Array; export function pluck(prop: K, list: readonly U[]): Array; From cc7ae0ade2e703d70e3d01b971e73ac04f7c362c Mon Sep 17 00:00:00 2001 From: harris-miller Date: Thu, 25 May 2023 03:32:30 -0600 Subject: [PATCH 4/5] support objects --- types/pluck.d.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/types/pluck.d.ts b/types/pluck.d.ts index 5104eb07..5db36472 100644 --- a/types/pluck.d.ts +++ b/types/pluck.d.ts @@ -1,7 +1,10 @@ import { Placeholder } from 'ramda'; export function pluck(prop: K extends Placeholder ? never : K): { + >(obj: Record): U extends readonly (infer T)[] ? T[] : U extends Record ? T[] : never; >(list: U[]): U extends readonly (infer T)[] ? T[] : U extends Record ? T[] : never; }; +export function pluck(__: Placeholder, obj: Record): (prop: K) => Array; export function pluck(__: Placeholder, list: readonly U[]): (prop: K) => Array; +export function pluck(prop: K, obj: Record): Array; export function pluck(prop: K, list: readonly U[]): Array; From a7a8b3c969902c44e5ba6b406441a33fde61293d Mon Sep 17 00:00:00 2001 From: harris-miller Date: Mon, 2 Oct 2023 00:42:57 -0600 Subject: [PATCH 5/5] pluck tests --- test/pluck.test.ts | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 test/pluck.test.ts diff --git a/test/pluck.test.ts b/test/pluck.test.ts new file mode 100644 index 00000000..5575b24d --- /dev/null +++ b/test/pluck.test.ts @@ -0,0 +1,35 @@ +import { expectType, expectError } from 'tsd'; + +import { __, pluck } from '../es'; + +type Obj = { name: string; age: number }; + +// pluck(key, list) +expectType(pluck('name', [] as Obj[])); +expectType(pluck('age', [] as Obj[])); +expectError(pluck('nope', [] as Obj[])); + +// pluck(key)(list) +expectType(pluck('name')([] as Obj[])); +expectType(pluck('age')([] as Obj[])); +expectError(pluck('nope')([] as Obj[])); + +// pluck(__, list)(prop) +expectType(pluck(__, [] as Obj[])('name')); +expectType(pluck(__, [] as Obj[])('age')); +expectError(pluck(__, [] as Obj[])('nope')); + +// pluck(key, record) +expectType(pluck('name', {} as Record)); +expectType(pluck('age', {} as Record)); +expectError(pluck('nope', {} as Record)); + +// pluck(key)(record) +expectType(pluck('name')({} as Record)); +expectType(pluck('age')({} as Record)); +expectError(pluck('nope')({} as Record)); + +// pluck(__, record)(prop) +expectType(pluck(__, {} as Record)('name')); +expectType(pluck(__, {} as Record)('age')); +expectError(pluck(__, {} as Record)('nope'));