Skip to content

Commit

Permalink
fix funtion-partial export type (#507)
Browse files Browse the repository at this point in the history
  • Loading branch information
tequdev authored Nov 19, 2022
1 parent 4636c2c commit 1fe5e57
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 62 deletions.
12 changes: 8 additions & 4 deletions packages/function-partial/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ type Tail<T extends Array<any>> =
((...t: T) => void) extends (h: any, ...rest: infer R) => void ? R : never;

/**
* Return a list of Args such that the corresponding value is undefined.
* @example PartialArgs<[number, string, boolean], [number, undefined, undefined]> equals to [string, boolean]
* @example PartialArgs<[number, string, ...boolean[]], [undefined, string]>
* Return a list of Args such that the corresponding value is undefined.
* @example PartialArgs<[number, string, boolean], [number, undefined, undefined]>
* equals to [string, boolean]
* @example PartialArgs<[number, string, ...boolean[]], [undefined, string]>
* equals to [number, ...boolean[]]
*/
type PartialArgs<Args extends any[], Values extends any[], Output extends any[] = []>
Expand All @@ -15,5 +16,8 @@ type PartialArgs<Args extends any[], Values extends any[], Output extends any[]
? PartialArgs<Tail<Args>, Tail<Values>, [...Output, Args[0]]>
: PartialArgs<Tail<Args>, Tail<Values>, Output>

export function partial<Values extends any[], F extends (...args: any) => any>(func: F, ...args: Values)
declare function partial<Values extends any[], F extends (...args: any) => any>
(func: F, ...args: Values)
: (...args: PartialArgs<Parameters<F>, Values>) => ReturnType<F>

export default partial
116 changes: 58 additions & 58 deletions packages/function-partial/index.tests.ts
Original file line number Diff line number Diff line change
@@ -1,106 +1,106 @@
import { partial } from './index';
import partial from './index';

// Case 1) one aurgument.
const sqrt = partial(Math.sqrt)
sqrt(16)
const sqrt = partial(Math.sqrt);
sqrt(16);

// @ts-expect-error
sqrt()
sqrt();
// @ts-expect-error
sqrt(2, 2)
sqrt(2, 2);
// @ts-expect-error
sqrt(true)
sqrt(true);

const sqrtOf16 = partial(Math.sqrt, 16)
sqrtOf16()
const sqrtOf16 = partial(Math.sqrt, 16);
sqrtOf16();

// @ts-expect-error
sqrtOf16(16)
sqrtOf16(16);

// Case 2) Two arguments.
const repeat = (str: string, n: number) => {
return str.repeat(n)
}
return str.repeat(n);
};

const anotherRepeat = partial(repeat)
anotherRepeat("a", 2)
const anotherRepeat = partial(repeat);
anotherRepeat('a', 2);

// @ts-expect-error
anotherRepeat()
anotherRepeat();
// @ts-expect-error
anotherRepeat("a")
anotherRepeat('a');
// @ts-expect-error
anotherRepeat(2)
anotherRepeat(2);
// @ts-expect-error
anotherRepeat(2, "a")
anotherRepeat(2, 'a');

const repeatHello = partial(repeat, "hello, ")
repeatHello(10)
const repeatHello = partial(repeat, 'hello, ');
repeatHello(10);

// @ts-expect-error
repeatHello()
repeatHello();
// @ts-expect-error
repeatHello([])
repeatHello([]);

const repeat3Times = partial(repeat, undefined, 3)
repeat3Times('hello, ')
const repeat3Times = partial(repeat, undefined, 3);
repeat3Times('hello, ');

// @ts-expect-error
repeat3Times()
repeat3Times();
// @ts-expect-error
repeat3Times({})
repeat3Times({});

const repeatHello3Times = partial(repeat, "hello, ", 3)
repeatHello3Times()
const repeatHello3Times = partial(repeat, 'hello, ', 3);
repeatHello3Times();

// @ts-expect-error
repeatHello3Times(1, 2, 3)
repeatHello3Times(1, 2, 3);

// Case 3) three arguments.
const getFormattedPrice = (amount: number, unit: string, includeTax: boolean) => {
const tax = includeTax ? 1.1 : 1
return `${unit}${amount * tax}`
}
const tax = includeTax ? 1.1 : 1;
return `${unit}${amount * tax}`;
};

const anotherGetFormattedPrice = partial(getFormattedPrice)
anotherGetFormattedPrice(100, "$", true)
const anotherGetFormattedPrice = partial(getFormattedPrice);
anotherGetFormattedPrice(100, '$', true);

// @ts-expect-error
anotherGetFormattedPrice({})
anotherGetFormattedPrice({});

const getFormattedPriceWithTax = partial(getFormattedPrice, undefined, undefined, true)
getFormattedPriceWithTax(100, "€")
const getFormattedPriceWithTax = partial(getFormattedPrice, undefined, undefined, true);
getFormattedPriceWithTax(100, '€');

const getFormattedPriceInUS = partial(getFormattedPrice, undefined, "$", undefined)
getFormattedPriceInUS(100, false)
const getFormattedPriceInUS = partial(getFormattedPrice, undefined, '$', undefined);
getFormattedPriceInUS(100, false);

const getFormattedCookiePrice = partial(getFormattedPrice, 100, undefined, undefined)
getFormattedCookiePrice("$", false)
const getFormattedCookiePrice = partial(getFormattedPrice, 100, undefined, undefined);
getFormattedCookiePrice('$', false);

const getFormattedCookiePriceInUS = partial(getFormattedPrice, 100, "$", undefined)
getFormattedCookiePriceInUS(true)
const getFormattedCookiePriceInUS = partial(getFormattedPrice, 100, '$', undefined);
getFormattedCookiePriceInUS(true);

const getFormattedCookiePriceWithoutTax = partial(getFormattedPrice, 100, undefined, false)
getFormattedCookiePriceWithoutTax("¥")
const getFormattedCookiePriceWithoutTax = partial(getFormattedPrice, 100, undefined, false);
getFormattedCookiePriceWithoutTax('¥');

const getFormattedPriceWithTaxInUS = partial(getFormattedPrice, undefined, "$", true)
getFormattedPriceWithTaxInUS(10000)
const getFormattedPriceWithTaxInUS = partial(getFormattedPrice, undefined, '$', true);
getFormattedPriceWithTaxInUS(10000);

const getFormattedCookiePriceWithTaxInUS = partial(getFormattedPrice, 100, "$", true)
getFormattedCookiePriceWithTaxInUS()
const getFormattedCookiePriceWithTaxInUS = partial(getFormattedPrice, 100, '$', true);
getFormattedCookiePriceWithTaxInUS();

// Case 4) arbitrarily many arguments.
const consoleLog = partial(console.log)
consoleLog("hello", ", ", "world")
const consoleLog = partial(console.log);
consoleLog('hello', ', ', 'world');

const logHello = partial(console.log, "Hello")
logHello()
const logHello = partial(console.log, 'Hello');
logHello();

const logHelloWorld = partial(console.log, "Hello", ", ", "world")
logHelloWorld()
const logHelloWorld = partial(console.log, 'Hello', ', ', 'world');
logHelloWorld();

const logGreetWorld = partial(console.log, undefined, ", ", "world")
logGreetWorld("Good Afternoon")
const logGreetWorld = partial(console.log, undefined, ', ', 'world');
logGreetWorld('Good Afternoon');

const logGreetToSomeone = partial(console.log, undefined, ", ")
logGreetToSomeone("Good Afternoon", "World", "!")
const logGreetToSomeone = partial(console.log, undefined, ', ');
logGreetToSomeone('Good Afternoon', 'World', '!');

0 comments on commit 1fe5e57

Please sign in to comment.