Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix funtion-partial export type #507

Merged
merged 1 commit into from
Nov 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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', '!');