Typescript: ์ œ์•ˆ๋œ ES Next "|>" ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์ž ์ง€์›

์— ๋งŒ๋“  2017๋…„ 08์›” 10์ผ  ยท  79์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

ES Next Suggestion Waiting for TC39

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ง€๊ธˆ 1๋‹จ๊ณ„์—์š”

๋ชจ๋“  79 ๋Œ“๊ธ€

๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ œ์•ˆ :( ์š”์ฆ˜์€ ์ •๋ง this ๋ฌด๋ฃŒ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ TC39 ์ œ์•ˆ: https://github.com/tc39/proposal-pipeline-operator

์ œ์•ˆ์ด ์•„์ง 0๋‹จ๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์–ธ์–ด ์˜๋ฏธ ์ฒด๊ณ„ ๋ฐ ๊ธฐํƒ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— (Enum ๋ฐ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์€ ์˜ค๋ž˜๋œ ์ œํ’ˆ์„ ์ œ์™ธํ•˜๊ณ ) ์ฒ˜์Œ์ด์ง€๋งŒ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” typescript๊ฐ€ ๋” ๋งŽ์€ ๊ฐ€์‹œ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ๋‚˜๋จธ์ง€ ecma ์ƒํƒœ๊ณ„์—์„œ ์ด์— ๋Œ€ํ•œ ์ˆ˜์š”๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://vanslaars.io/post/create-pipe-function/...์—์„œ ์˜๊ฐ์„ ์–ป์€ ๋ˆ„๋ฝ๋œ ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค

๋™๊ธฐ์‹ ๊ฐ์†Œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” SyncPipe

// SyncPipe with synchronous reduction
type SyncPipeMapper<T, U> = (data: T | U) => U;
type SyncPipeReducer<T, U> = (f: SyncPipeMapper<T, U>, g: SyncPipeMapper<T, U>) => SyncPipeMapper<T, U>;
type SyncPipe<T, U> = (...fns: SyncPipeMapper<T, U>[]) => SyncPipeMapper<T, U>;
function createSyncPipe<T, U>(): SyncPipe<T, U> {
    const syncPipe: SyncPipeReducer<T, U> = (f: SyncPipeMapper<T, U>, g: SyncPipeMapper<T, U>) => (data: T) => g(f(data));
    return (...fns: SyncPipeMapper<T, U>[]): SyncPipeMapper<T, U> => fns.reduce(syncPipe);
}

// Example:
function testSyncPipe(num: number): number {
    const addOne: SyncPipeMapper<number, number> = (data: number): number => {
        return data + 1;
    }
    const syncPipe: SyncPipe<number, number> = createSyncPipe();
    const syncWaterfall: SyncPipeMapper<number, number> = syncPipe(
        addOne,
        addOne,
        addOne,
    );

    // Does the equivalent of num+3
    const lastnumber: number = syncWaterfall(num);
    return lastnumber;
}

๋น„๋™๊ธฐ์‹ ๊ฐ์†Œ๊ฐ€ ์žˆ๋Š” AsyncPipe

// AsyncPipe with asynchronous reduction
type AsyncPipeMapper<T, U> = (data: T | U) => Promise<U>;
type AsyncPipeReducer<T, U> = (f: AsyncPipeMapper<T, U>, g: AsyncPipeMapper<T, U>) => AsyncPipeMapper<T, U>;
type AsyncPipe<T, U> = (...fns: AsyncPipeMapper<T, U>[]) => AsyncPipeMapper<T, U>;
function createAsyncPipe<T, U>(): AsyncPipe<T, U> {
    const asyncPipe: AsyncPipeReducer<T, U> = (f: AsyncPipeMapper<T, U>, g: AsyncPipeMapper<T, U>) => async (data: T) => g(await f(data));
    return (...fns: AsyncPipeMapper<T, U>[]): AsyncPipeMapper<T, U> => fns.reduce(asyncPipe);
}

// Example:
async function testAsyncPipe(num: number): Promise<number> {
    const addOne: AsyncPipeMapper<number, number> = async (data: number): Promise<number> => {
        return data + 1;
    }
    const asyncPipe: AsyncPipe<number, number> = createAsyncPipe();
    const asyncWaterfall: AsyncPipeMapper<number, number> = asyncPipe(
        addOne,
        addOne,
        addOne,
    );

    // Does the equivalent of num+3
    const lastnumber: number = await asyncWaterfall(num);
    return lastnumber;
}

๋น„๋™๊ธฐ์‹ ๊ฐ์†Œ๊ฐ€ ์žˆ๋Š” ํŒŒ์ดํ”„(๋‹จ์ˆœํ™”๋จ)

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

// Pipes with asynchronous reduction
type PipeMapper<T> = (data: T) => Promise<T>;
type PipeReducer<T> = (f: PipeMapper<T>, g: PipeMapper<T>) => PipeMapper<T>;
type Pipe<T> = (...fns: PipeMapper<T>[]) => PipeMapper<T>;
function createPipe<T>(): Pipe<T> {
    const pipePipe: PipeReducer<T> = (f: PipeMapper<T>, g: PipeMapper<T>) => async (data: T) => g(await f(data));
    return (...fns: PipeMapper<T>[]): PipeMapper<T> => fns.reduce(pipePipe);
}

// Example:
async function testPipe(num: number): Promise<number> {
    const addOne: PipeMapper<number> = async (data: number): Promise<number> => {
        return data + 1;
    }
    const pipe: Pipe<number> = createPipe();
    const waterfall: PipeMapper<number> = pipe(
        addOne,
        addOne,
        addOne,
    );
    // Does the equivalent of num+3
    const lastnumber: number = await waterfall(num);
    return lastnumber;
}

๋„์›€์ด ๋˜์…จ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@PublicParadise ๋„ˆ๋ฌด ๋งŽ์€ ์ƒ์šฉ๊ตฌ :p

์–ธ์–ด์—์„œ ์ด ์—ฐ์‚ฐ์ž์˜ ์ผ๋ถ€ ๋ณ€ํ˜•์„ ํ™•์‹คํžˆ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ํ˜„์žฌ ์ƒํƒœ์—์„œ ECMAScript์˜ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ œํ•œ์—์„œ ๋น„๋กฏ๋œ ํ•„์š”์„ฑ ์ธ์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” ์–ธ์–ด๋กœ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‚ด์žฅ ๊ฐ์ฒด๋ฅผ ์œ„์ƒ์ ์ธ โ€‹โ€‹๋ฐฉ์‹์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๋ฒˆ์งธ๋Š” ์–ธ์–ด ์ˆ˜์ค€ ์ง€์›์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ๋กœ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์นœ์ ˆํ•˜๊ฒŒ ๋นˆํ˜ˆ์ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ๋Œ€ ์ตœ์†Œ๋Š” ์™„์ „ํ•œ ์‹คํŒจ์ž…๋‹ˆ๋‹ค.

์–ธ์–ด๋กœ Array.prototype.flatMap ๋ฅผ ์–ป๋Š” ๋ฐ ๋ช‡ ๋‹ฌ, ๋ช‡ ๋‹ฌ์ด ๊ฑธ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฑฐ๊ธฐ์— ์žˆ์–ด์•ผ ํ•˜๊ณ  ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ Array.prototype ๋Š” 6๋…„ ์•ˆ์— groupBy ๋ฐฉ์‹์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ์ด๊ฒƒ์€ TC39 ์ œ์•ˆ์— ๋„์›€์ด ๋  ๋ช‡ ๊ฐ€์ง€ babel ๊ตฌํ˜„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ 1๋‹จ๊ณ„์—์š”

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฏธ์ธ์ด TS์— ๋“ค์–ด๊ฐˆ ๊ฐ€๋Šฅ์„ฑ์€? F#๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. <3

์˜ˆ์™ธ๊ฐ€ ์žˆ์ง€๋งŒ ์ œ์•ˆ์ด TypeScript ๋ฐ ์œ ํ˜•์— _์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์ œ์•ˆ์€ ์ผ๋ฐ˜์ ์œผ๋กœ TypeScript์˜ TC39 Stage 3 ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๊ตฌํ˜„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹ฌ๊ฐํ•œ ํŒŒ์† ๋ฐ ํšŒ๊ท€๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์•ˆ์ •์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํŒ€ ์ค‘ ์–ด๋Š ๋ˆ„๊ตฌ๋„ ์•„์ง ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” 3๋‹จ๊ณ„ ์ด์ „์— ๊ตฌํ˜„์„ ์œ„ํ•ด ๊ณ ๋ ค๋  ๋งŒํผ _์ค‘์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ์ดˆ์ ์€ TC39์—์„œ ์ฑ”ํ”ผ์–ธ๊ณผ ์ œ์•ˆ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TS์— ์ด ์—ฐ์‚ฐ์ž๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋Š” babel์ด ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์˜ต์…˜๋งŒ ์žˆ๋‹ค๋ฉด.
๋˜๋Š” post-css์™€ ๊ฐ™์€ ์ž์ฒด ๊ตฌ๋ฌธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ช‡ ๋…„์€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

@garkin : ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” TS๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์ž„์˜์˜ ์ฝ”๋“œ์™€ ์ž˜ ๊ฒฐํ•ฉ๋˜์ง€ ์•Š๋Š” ํ˜•์‹ ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งคํฌ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š” ํ•œ(#4892), ์ด ๊ฒฝ์šฐ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ƒ๋‹น์ˆ˜๊ฐ€ ์—ฌ์ „ํžˆ atm์„ ์ž…๋ ฅํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๋“œ๋งต์—์„œ๋Š” ์•„์ง ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ œ Babel์ด ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ดํ•ดํ•˜๋ฏ€๋กœ Babel์„ ํ†ตํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ

2017๋…„ 10์›” 26์ผ 19์‹œ 1๋ถ„์— "Tycho Grouwstra" [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@garkin https://github.com/garkin : ์—ฌ๊ธฐ์„œ TS๊ฐ€ ํ•ด์•ผ ํ•  ๊ณผ์ œ๋Š”
์œ ํ˜• ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์ž„์˜์˜ ์ฝ”๋“œ์™€ ์ž˜ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์–ป๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด
๋งคํฌ๋กœ(#4892 https://github.com/Microsoft/TypeScript/issues/4892 ),
์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ดํ•ดํ•˜๋Š” ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚œํ•˜์ง€ ์•Š์„๊ฑฐ์•ผ
๋กœ๋“œ๋งต์—์„œ๋Š” ์•„์ง ํ‘œ์ค€์˜ ๋ช‡ ๋น„ํŠธ๊ฐ€
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ atm์„ ์ž…๋ ฅํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

โ€”
์Šค๋ ˆ๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/17718#issuecomment-339748284 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAZQTO6UiVHbrM6SRwaBhm8obaa3R7e9ks5swMkCgaJpZM4OzVEg
.

์ด์ œ Babel์ด ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ดํ•ดํ•˜๋ฏ€๋กœ Babel์„ ํ†ตํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ

๊ทธ๋ž˜๋„ ๋นŒ๋“œ ์‹œ๊ฐ„์€ ๋‘ ๋ฐฐ :p

typescript๊ฐ€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋‘ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ํŒŒ์ดํ”„

2017๋…„ 10์›” 26์ผ 20์‹œ 16๋ถ„์— "AlexGalays" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด์ œ Babel์ด ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ดํ•ดํ•˜๋ฏ€๋กœ Babel์„ ํ†ตํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ

๊ทธ๋ž˜๋„ ๋นŒ๋“œ ์‹œ๊ฐ„์€ ๋‘ ๋ฐฐ :p

โ€”
์Šค๋ ˆ๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/17718#issuecomment-339769856 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAZQTEArBw8jj0BcZFM2yLj5ErfbtNrgks5swNqagaJpZM4OzVEg
.

@graingert : ์ข‹์€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ถˆํ–‰ํžˆ๋„ VisualStudioCode, Webstorm ๋ฐ ๊ธฐํƒ€ IDE์—์„œ ์‚ฌ์šฉ๋˜๋Š” typescript Language Service API์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"TS ํ”Œ๋Ÿฌ๊ทธ์ธ"๊ณผ ๊ด€๋ จํ•˜์—ฌ ์˜ˆ๋ฅผ ๋“ค์–ด TS ๊ตฌ๋ฌธ์„ ์ดํ•ดํ•˜๊ณ  ๋ช…๋ น๋ฌธ๊ณผ ๋™์ผํ•œ ํ˜•์‹์˜ ๊ฐ•๋ ฅํ•œ ํ˜•์‹์„ ์ƒ์„ฑํ•˜๋Š” ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ (์‚ฌ์ „) ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๊ฒ€์‚ฌ ๋“ฑ์œผ๋กœ ์ž˜ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์›นํŒฉ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

module: {
        rules: [
            { test: /\.ts$/, loader: 'ts-pipe-operator', enforce: 'pre' },
            { test: /\.ts$/, loader: 'ts-loader' },
            ...
        ]
 }

@garkin์ด ์ง€์ ํ•œ ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” TS ์„œ๋น„์Šค๊ฐ€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ๋ถ€๋ถ„์„ ์›๋ณธ ์†Œ์Šค ํŒŒ์ผ๊ณผ ์—ฐ๊ด€์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” IDE๊ฐ€ ์ด๋ฏธ ์—ฐ์‚ฐ์ž๋ฅผ ์ธ์‹ํ•˜๋”๋ผ๋„ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ES Next ๊ตฌ๋ฌธ ํ™œ์„ฑํ™” ๋˜๋Š” ๊ธฐํƒ€).

์†Œ์Šค ํŒŒ์ผ๊ณผ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ œ๊ณต๋˜๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ๊ฒฐ๊ณผ ์‚ฌ์ด์— ์ ์šฉํ•  ๋ˆ„์  ์†Œ์Šค ๋งต์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด TS ์„œ๋น„์Šค์— ๋Œ€ํ•œ NFR(๋˜๋Š” ์ด๋ฏธ ํ•˜๋‚˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ)์„ ์ƒ์„ฑํ•˜๋ฉด ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ•ต์‹ฌ ํŒ€์ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋˜ํ•œ #13940์ด ์ด๊ฒƒ๊ณผ ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€ ๋งํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋” ๋ณต์žกํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ–ฅํ•œ ์ข‹์€ ์‹œ์ž‘์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์†Œํ•œ์˜ (์‚ฌ์ „) ๋ณ€ํ™˜๊ธฐ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์†Œ์Šค ๋งต ์ ‘๊ทผ ๋ฐฉ์‹์ด ์—ฌ์ „ํžˆ ํ›จ์”ฌ ๊ฐ„๋‹จํ•œ ๋Œ€์•ˆ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ช…๋ น๋ฌธ ์›์‹œ ํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ ์ œ์–ด ํ๋ฆ„์ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํŠน์ • I/O ์œ ํ˜•์„ ์•”์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.


๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๊ด€๋ จํ•˜์—ฌ _official_ ์Šค๋ ˆ๋“œ(์žˆ๋Š” ๊ฒฝ์šฐ)๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

Flow+Babel ๋ฐ Post-CSS ํŠน์ˆ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์˜ฌ๋ฆผํ”ฝ๋ณด๋‹ค ์ƒˆ๋กœ์šด ์ œ์•ˆ์„ ๋„์ž…ํ•˜๋Š” ์ฐจ๋ถ„ํ•œ ๋ฐฉ๋ฒ•๊ณผ ๋ชจ๋†€๋ฆฌ์‹ Typescript ๋ฐ LessCSS ๋„๊ตฌ๋ฅผ ํ›จ์”ฌ ๋” ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋‹จํŽธํ™”๋ฅผ ๋ถ€์ถ”๊ธฐ๋Š” ๋Œ€๊ฐ€๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์–ป๋Š” ์†๋„์™€ ์ „๋ฌธ ๋ถ„์•ผ์ž…๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„ ์˜คํผ๋ ˆ์ดํ„ฐ๋Š” ๊ธฐ๋Šฅ์  ์„ธ๊ณ„๋กœ ์ง„์ž…ํ•˜๋Š” ๋งˆ์•ฝ๊ณผ๋„ ๊ฐ™์•„์„œ ์ด์ƒํ•œ ๋ง์„ ํ•˜๊ณ  ๋ฐ”๋ผ๊ฒŒ ๋งŒ๋“ ๋‹ค.

๋”ฐ๋ผ์„œ #14419์™€ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ์‹ค์šฉ์ ์ธ ์˜๋ฏธ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ts-loader ์™€ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

tsconfig.json ๋ณ€ํ™˜๊ธฐ ํ†ตํ•ฉ(๋‹จ์ˆœํ•œ tsc ์•„๋‹Œ Language Service API) #14654๊ฐ€ _๋‹จ๊ธฐ์ ์œผ๋กœ_ ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

11976์€ Linting ์ „์šฉ ๋„๊ตฌ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” Language Service ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

16607์€ ์ด๋Ÿฌํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ณ€ํ™˜๊ธฐ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

@PublicParadise ๋˜๋Š” lodash์˜ flow ๋˜๋Š” Rambda์˜ pipe ?

์–ด์จŒ๋“ , ์ด๊ฒƒ์€ TS์—์„œ ์ง€์›๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” JS๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์  ํŒจํ„ด(ํŠนํžˆ TS์˜ ์œ ํ˜• ์ถ”๋ก )์„ ์ข‹์•„ํ•˜์ง€๋งŒ ์ผ๋ถ€ ํŒจํ„ด์€ ์ž˜ ์ฝํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. RxJS ๋ฐ IxJS์™€ ๊ฐ™์€ ๋Œ€ํ˜• TS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ”„๋กœํ† ํƒ€์ž… ํ™•์žฅ/์ƒ์†๋ณด๋‹ค ํฌ์ธํŠธ ์—†๋Š” ๊ธฐ๋Šฅ ๊ตฌ์„ฑ์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ๋งค์šฐ ํด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ ์‰์ดํ‚น ๋ฐ ์‚ฌ์šฉ์ž ์ •์˜ ์—ฐ์‚ฐ์ž ์ง€์›์ด ํ›จ์”ฌ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

@felixfbecker ๋‹น์‹ ์€ ramda์˜ pipe ํ•ฉ๋‹ˆ๊นŒ? ๋‹ค์‹œ ์‹œ๋„ํ•ด์•ผ ํ•˜์ง€๋งŒ ์—ญ์‚ฌ์ ์œผ๋กœ ramda๋Š” JS-first lib์ด๋ฏ€๋กœ ๋งค์šฐ ๋™์ ์ด๊ณ  ์ž…๋ ฅํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค(lodash์™€ ๊ฐ™์€). TS๊ฐ€ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์—์„œ ์ถ”๋ก ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์— ๋ณตํ•ฉ์ ์ž…๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Œ)
lodash ๋Š” ์ž˜๋ชป ์„ค๊ณ„๋˜์–ด ํ•˜๋‚˜์˜ ํฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ๊ณผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ์„ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์Šฌ์ด ์•„์ฃผ ์ด์ƒํ•˜์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/b67c928904f03d0911c99ab938b14bc2e59cad40/types/lodash/index.d.ts#L7819 -L7855

๋‹น์‹ ์˜ ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์Šฌ์ด ์•„์ฃผ ํ›Œ๋ฅญํ•˜์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ '๋งค์šฐ ๋ฏธ์นœ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค'๋ผ๋Š” ์ž๊ฒฉ์„ ๋ถ€์—ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜์— ์ œ๋„ค๋ฆญ์ด ์žˆ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค(https://github.com/types/npm-ramda/issues/86 ์ฐธ์กฐ), ์˜ˆ: R.pipe(R.identity) .

๋˜ํ•œ ์ œ์•ˆ์ด Stage 1์ด๋ผ๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•ฉ์‹œ๋‹ค. ํ•ต์‹ฌ ํŒ€์€ Stage 3 ์ด์ „์— ๋„์ž…ํ•˜๋Š” ๊ฒƒ์„ ๋”์šฑ ๋ถ€๋„๋Ÿฌ์›Œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋„ ๊ทธ ์˜ˆ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ๋น„๋ก ๊ทธ๊ฒƒ๋“ค์ด _experimental_๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๊ณ„์†ํ•ด์„œ ๊ทธ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์€ ์ด์ œ ๋ฐ˜๋“ฑํ–ˆ๊ณ  ๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ ์ฒด๊ณ„์— ๋ช‡ ๊ฐ€์ง€ ๊ทผ๋ณธ์ ์ธ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•ต์‹ฌ ํŒ€์„ ๊ณค๊ฒฝ์— ๋น ๋œจ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋ฆด๋ฆฌ์Šคํ•˜๋Š” ๋‚  ๊ตฌ๋ฌธ์ด ์†์ƒ๋˜๊ฑฐ๋‚˜ ๋ ˆ๊ฑฐ์‹œ ํ•ญ๋ชฉ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋‹ค๋ฅธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ๋‘ ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฒฐ๊ตญ์—๋Š” ์ด์ „ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์–ธ์ œ.. ๐Ÿ’ฅ ๐Ÿ’ฅ

๋”ฐ๋ผ์„œ ์ด์™€ ๊ฐ™์€ ํ‘œ์ค€ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ์„œ TypeScript์˜ ์ง€์› ๋˜๋Š” ์ง€์› ๋ถ€์กฑ์— ๋Œ€ํ•ด ํ† ๋ก ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์นœ๊ทผํ•œ ์ง€์—ญ TC39 ๋‹ด๋‹น์ž๋ฅผ ์ฐพ์•„ ์ด ๊ธฐ๋Šฅ์ด ๊ท€ํ•˜์—๊ฒŒ ๋งค์šฐ ์ค‘์š”ํ•˜๊ณ  GitHub์—์„œ ์œ„์— ๋งํฌ๋œ ์ œ์•ˆ ๋Œ€ํ™”. ์‹œ๋งจํ‹ฑ์ด ๋” ๋นจ๋ฆฌ ํ•ด๊ฒฐ๋˜๊ณ  3๋‹จ๊ณ„์— ๋” ๋นจ๋ฆฌ ๋„๋‹ฌํ• ์ˆ˜๋ก ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋” ๋นจ๋ฆฌ ์ข‹์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ด์ œ rxjs ์— lettable ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ Typescript์— ์žˆ๋Š” ํ›จ์”ฌ ๋” ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
https://github.com/ReactiveX/rxjs/blob/master/doc/lettable-operators.md

TS ํŒ€์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ์š”์ฒญ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋“ค์€ ES Next ๋ฐ Suggestion ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค ... ES Next ์ œ์•ˆ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•œ ๋‹ค๋ฅธ ์œ„์น˜์™€ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‹œ๊ธฐ ๋ฐ ๋ฐฉ๋ฒ•์„ ์ธ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค๋กœ๋ถ€ํ„ฐ์˜ ์ฝ”๋ฉ˜ํŠธ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ”๊พธ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์•Œ๋ ค์ง€๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋’ค์—์„œ ๋น„๋ฐ€๋ฆฌ์— ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์ถ”๊ฐ€ํ•  ์‚ฌํ•ญ์ด ์—†์œผ๋ฉด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž…๋ ฅํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค... ์ด๋ฏธ ๋งํ•œ ๋‚ด์šฉ์— ์ถ”๊ฐ€ํ•  ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ๋‚˜๋Š” ์–ธ์–ด๋ฅผ ํ™•์žฅํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ํ•ต์‹ฌ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ผ๋ถ€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

@aminpaks ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ณง babelification์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์•„์ด๋””์–ด๋ฅผ ์ •๋ง๋กœ ์‚ฌ๋ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ฐ”๋ฒจ์˜ ํƒ‘์—์„œ์™€ ๊ฐ™์ด ์šฐ์ˆ˜ํ•œ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ Babeljs๊ฐ€ ์•„๋‹ˆ๋ผ ๐Ÿ˜€)

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์œ ํ˜• ์ˆ˜์ค€ ๋™์ž‘์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ณ  ์†Œ์Šค ์ˆ˜์ค€ ์ข…์†์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด TypeScript์— ํ˜„์žฌ ๋ถ€์กฑํ•œ ์—ฌ๋Ÿฌ ๋ณต์žกํ•˜์ง€๋งŒ ๋งค์šฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ณณ์—์„œ ์ด๊ฒƒ์„ _์‚ฌ๋ž‘_ ํ•˜๊ณ  ์‹ถ์€ ๋งŒํผ TS๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ํ‘œ์ค€์„ ๊ณ ์ˆ˜ํ•˜๋Š” ๋ฐ ์ข€ ๋” ์œ ๋ณด์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž…์žฅ์€ ํ‘œ์ค€์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์— ๊นŠ์€ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ๊ณต๊ธ‰์—…์ฒด/JS ์—”์ง„ ์ฑ„ํƒ์— ์•ž์„œ(๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜๋“œ์‹œ ํ‘œ์ค€ํ™”๋ณด๋‹ค ์•ž์„œ๋Š” ๊ฒƒ์€ ์•„๋‹˜) ๋ณ€ํ™˜์ด ์ œ๊ณตํ•˜๋Š” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ฆ๊ธฐ๋Š” ๋‚˜์™€ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ TS๋ฅผ ์ „๋ฐ˜์ ์œผ๋กœ ๋” ๋งค๋ ฅ์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์„ฌ์„ธํ•œ ๊ท ํ˜•์„ ์žก๋Š” ๋™์ž‘์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” bind-operator๋ฅผ ํฌ์ƒ์‹œํ‚ค๋ฉด์„œ ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์ž๋ฅผ ์„ ํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ์ด ์ •๋ง ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„:

function* where<T>(items: Iterable<T>, predicate: (item:T)=>boolean){
  for (let item of items){
    if(predicate(item)) yield item;
  }
}

๋ฐ”์ธ๋”ฉ ์ž‘์—…:

[1,2,3]::where(x=>x>2)

ํŒŒ์ดํ”„๋ผ์ธ ์ž‘์—…:

[1,2,3]|>(_)=>where(_,x=>x>2)

ts-team์€ 3๋‹จ๊ณ„๊นŒ์ง€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋•Œ์—๋„ 3๋‹จ๊ณ„ ์ œ์•ˆ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ฒ ํšŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: SIMD). ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. "์œ„ํ—˜"์€ ๊ฐœ๋ณ„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ „๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋„ ๋งŽ์ด ์žˆ์œผ๋ฉฐ, ํŠนํžˆ typescript๊ฐ€ ํฌํ•จ๋œ .vue ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

@MeirionHughes ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์„คํƒ•์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜์ •๋˜๊ณ  ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ตฌ์ถ•๋˜๋Š” ์–ธ์–ด์—์„œ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํŒŒ์ดํ”„๋ผ์ธ ๋ฉ”์„œ๋“œ๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ ๊ฐ’์˜ _not_ ๊ตฌ์„ฑ์›์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋‹น์‹ ์€

function where<T>(predicate: (item: T) => boolean): (items: Itererable<T>) => Itererable<T> {
  return function* () {
    for (const item of items) if (predicate(item)) yield item;
  };
}

function select<T, R>(projection: (item: T) => R): (items: Itererable<T>) => Itererable<R> {
  return function* () {
    for (const item of items) yield projection(item);
  };
}

๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ์“ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค

[1, 2, 3] |> where(x => x > 2) |> select(x => x ** 2);

๊ทธ๋Ÿฌ๋‚˜ JavaScript๋Š” ์ž๋™ ์ปค๋ฆฌ ๊ธฐ๋Šฅ์„ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•  ์ˆ˜๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋ง์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋งŒ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ œ์•ˆ์— ๋Œ€ํ•ด ์ตœ์‹  ์ •๋ณด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปค๋ฆฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ƒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒˆ ํ‘œ์ค€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@AlexGalays ์ด๊ฒƒ์ด ํ†ต๊ณผํ•˜๋ฉด ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. JavaScript๋ฅผ OCaml๋กœ ๋ฐ”๊พธ๋ ค๋Š” ํŒŒ๊ดด์ ์ธ ์Œ๋ชจ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋ฉ๋‹ˆ๋‹ค.

@MeirionHughes ๊ท€ํ•˜์˜ ์˜ˆ๊ฐ€ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. where ํ•จ์ˆ˜๋Š” this ๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ bind ์—ฐ์‚ฐ์ž๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ”์ธ๋“œ ์—ฐ์‚ฐ์ž๋Š” ๋˜ํ•œ ํ˜•์‹ ์•ˆ์ „์„ฑ์— ๋Œ€ํ•ด ๋งŽ์€ ๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. where ๋Š” ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ this ์—์„œ ๊ฐœ์ธ ์†์„ฑ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด this ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์š”์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์œ  ์žฌ์‚ฐ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๊ฐ‘์ž๊ธฐ ์‚ฌ์œ  ์žฌ์‚ฐ์˜ ๋ชฉ์ ์„ ์™„์ „ํžˆ ๋ฌด๋„ˆ๋œจ๋ฆฌ๋Š” ์—„์ฒญ๋‚œ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ ๊ตฌ๋ฌธ์ด ์ฝ๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ๋ช…์‹œํ•˜์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด bind-operator ์˜ˆ์ œ์—์„œ๋Š” ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•˜์ง€๋งŒ ํŒŒ์ดํ”„๋ผ์ธ ์˜ˆ์ œ์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์ž๋Š” ๋ฌผ๋ก  ๋ฐ”์ธ๋”ฉ์šฉ์œผ๋กœ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜์—์„œ๋Š” ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ rxjs ์—ฐ์‚ฐ์ž, ramda ๋˜๋Š” lodash/fp์™€ ๊ฐ™์€ ์ปค๋ฆฌ ํ•จ์ˆ˜์—๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@aluanhaddad ๋ชจ๋“  fp ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™ธ์—๋„ RxJS๋Š” ํ”„๋กœํ† ํƒ€์ž…์˜ ์—ฐ์‚ฐ์ž(๋Œ€๋ถ€๋ถ„ ํŠธ๋ฆฌ ํ”๋“ค๊ธฐ ๋ฐ ์ผ๋ฐ˜ ์œ ํ˜• ์•ˆ์ „๊ณผ ๊ด€๋ จ๋œ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ)์—์„œ ์ปค๋ฆฌ ํ•จ์ˆ˜๋กœ์„œ์˜ ์—ฐ์‚ฐ์ž๋กœ ์ด๋™ํ•œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋งˆ๋„ ์ง€๊ธˆ ๋‹น์žฅ์€ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์„ ํƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์ด์— ๋Œ€ํ•œ ์ข‹์€ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@felixfbecker ๋‹น์‹ ์ด ์˜ณ์•˜๊ณ  ํŒŒ์ดํ”„๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒฐ๊ณผ ํ•จ์ˆ˜๋ฅผ ์ค‘์ฒฉํ•˜๋Š” @aluanhaddad ์˜ ์˜ˆ๊ฐ€ ๋‚ด ๋งˆ์Œ์„ ์™„์ „ํžˆ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ ์ง€์›์„ ์กฐ๊ธˆ ๋” ์ผ์ฐ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ƒ๊ฐํ–ˆ๊ฑฐ๋‚˜ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฒ‰๋ณด๊ธฐ์—๋Š” ๋‹จ์ˆœํžˆ babel transpile _just_ ํŒŒ์ดํ”„๋ผ์ธ ๋ถ€๋ถ„ ์ž์ฒด๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๋ณ€ํ™˜๊ธฐ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ https://github.com/cevek/ttypescript ๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•  ์ˆ˜

๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ TypeScript ๋„๊ตฌ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์œ ์ง€ํ•˜๋ฉด์„œ Babel ์ง€์› ์ง€์› ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์•„๋งˆ๋„? 0-2๊ฐœ์˜ ์ œ์•ˆ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ์‚ฌ์ „ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค: https://www.npmjs.com/package/babel-preset-proposal-typescript - ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณด๋‚ด๊ธฐ ์ „์— ์ด๊ฒƒ์„ ๋„ฃ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ intellisenseํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ์ง€๋ฃจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ https://github.com/cevek/ttypescript#visual -studio-code๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@MeirionHughes ๋„์›€์ด ๋˜์—ˆ๋‹ค๋‹ˆ ๊ธฐ์˜๋„ค์š” โค๏ธ.
์ด์ œ ์ž„์˜ ํ”„๋กœํ† ํƒ€์ž…์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ปค๋ฆฌ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก #6606๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

TypeScript๋Š” ์ด์ œ babel ๋ณ€ํ™˜์ž…๋‹ˆ๋‹ค. TypeScript๊ฐ€ ํ†ต๊ณผํ•˜๊ธฐ ์ „์— ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋””์Šˆ๊ฐ€๋ง์„ ์‹œํ€€์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์–ธ์–ด ์„œ๋ฒ„์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

TS #22816์— ๋Œ€ํ•œ ์ž์ฒด ํ˜ธ์ŠคํŒ… ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์ž๋ฅผ ์ถ”์ง„ํ•˜๋Š” ์‚ฌ๋žŒ ์ค‘ ํ•œ ์‚ฌ๋žŒ์œผ๋กœ์„œ ๊ฐ„์ฒญํ•ฉ๋‹ˆ๋‹ค. ๋” ๋ฐœ์ „ํ•  ๋•Œ๊นŒ์ง€ TypeScript์—์„œ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜์ง€ _๋งˆ์‹ญ์‹œ์˜ค_. ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ๊ทผ๋ณธ์ ์œผ๋กœ ์„œ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋‘ ๊ฐ€์ง€ ์ž ์žฌ์ ์ธ ์ œ์•ˆ์— ๋Œ€ํ•ด ํ† ๋ก ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ TypeScript๋Š” ์ด๊ฒƒ์„ ๋„ˆ๋ฌด ์ผ์ฐ ๊ตฌํ˜„ํ•˜๋ฉด ์„ธ๊ณ„์— ๊ณ ํ†ต์„ ํ˜ธ์†Œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์—์„œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ฐธ์—ฌํ•˜์‹ญ์‹œ์˜ค. https://github.com/tc39/proposal-pipeline-operator/ ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ์ œ์•ˆ์— ๋Œ€ํ•ด Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์—… ์ค‘์ด๋ฏ€๋กœ (TypeScript๊ฐ€ ์•„๋‹Œ) ํ”„๋กœ์ ํŠธ์—์„œ ์‹œ๋„ํ•ด ๋ณผ ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ œ์•ˆ์€ ์•„์ง TypeScript์™€ ๊ฐ™์€ ๊ฒƒ์— ์ฐฉ๋ฅ™ํ•  ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ์ด ๋ณ‘ํ•ฉ ์•„๋‹™๋‹ˆ๋‹ค.

https://github.com/babel/babel-eslint ์™€ ๊ฐ™์ด Babel์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  TypeScript์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด ์ œ๊ฑฐ๋œ ํ›„์—๋„ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@masaeedu ๋„ค! ์ด๊ฒƒ

@MeirionHughes ๋ถ€๋ถ„ ์ ์šฉ ์ œ์•ˆ์œผ๋กœ ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

[1,2,3] |> where(?, x=>x>2)

@bernatmv : fwiw ์˜ค๋Š˜๋‚  ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ€๊นŒ์šด ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@tycho01 ํ•˜์ง€๋งŒ TypeScript์—๋Š” ์—†๊ณ  2.8๊ฐœ์˜ ํƒ€์ดํ•‘์„ ์–ป์„ ๋•Œ๊นŒ์ง€: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/25067

@jeremejevs @bernatmv ์‹ค์ œ๋กœ R.__ ๋Š” npm-ramda ์—์„œ codegen์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 2.8์„ ์‚ฌ์šฉํ•˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ• ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

์ €๋Š” Javascript์™€ TypeScript(2์ฃผ)์— ๋‹ค์†Œ ์ต์ˆ™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์žˆ๋‹ค๋ฉด ์ €๋ฅผ ์šฉ์„œํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์šด์˜์ž๊ฐ€ ์—†์„ ๋•Œ ์ƒ๊ฐํ•ด ๋‚ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›๋ž˜ 2, 3, 4 ๋“ฑ์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” pipe ์˜ ์—ฌ๋Ÿฌ ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ C#์—์„œ์™€ ๊ฐ™์ด TypeScript ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. pipe1<A,B> , pipe2<A,B,C> , pipe3<A,B,C,D> ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธ์ˆ˜์˜ ์ˆ˜์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์›ํ–ˆ๋‹ค. ์•„๋ž˜์—์„œ ์ œ์•ˆํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•œ ์œ ํ˜• ์•ˆ์ „ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌด์ œํ•œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ๊ท€ ์œ ํ˜• ์ •์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์กฐ๊ฑด ์œ ํ˜•์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

type LastOf<
    A,
    B=never,
    C=never,
    D=never,
    E=never,
    F=never,
    G=never,
    H=never,
    I=never,
    J=never> =
    [B] extends [never] ? A :
    [C] extends [never] ? B :
    [D] extends [never] ? C :
    [E] extends [never] ? D :
    [F] extends [never] ? E :
    [G] extends [never] ? F :
    [H] extends [never] ? G :
    [I] extends [never] ? H :
    [J] extends [never] ? I :
    J;

export function pipe<A, B, C=never, D=never, E=never, F=never, G=never, H=never, I=never, J=never>(
    a: A,
    mapA: (a: A) => B,
    mapB?: (b: B) => C,
    mapC?: (c: C) => D,
    mapD?: (d: D) => E,
    mapE?: (e: E) => F,
    mapF?: (f: F) => G,
    mapG?: (g: G) => H,
    mapH?: (h: H) => I,
    mapI?: (i: I) => J
): LastOf<A, B, C, D, E, F, G, H, I, J> {
    if (mapB === undefined) {
        return mapA(a) as LastOf<A, B, C, D, E, F, G, H, I, J>;
    }
    if (mapC === undefined) {
        return mapB(mapA(a)) as LastOf<A, B, C, D, E, F, G, H, I, J>;
    }
    if (mapD === undefined) {
        return mapC(mapB(mapA(a))) as LastOf<A, B, C, D, E, F, G, H, I, J>;
    }
    if (mapE === undefined) {
        return mapD(mapC(mapB(mapA(a)))) as LastOf<A, B, C, D, E, F, G, H, I, J>;
    }
    if (mapF === undefined) {
        return mapE(mapD(mapC(mapB(mapA(a))))) as LastOf<A, B, C, D, E, F, G, H, I, J>;
    }
    if (mapG === undefined) {
        return mapF(mapE(mapD(mapC(mapB(mapA(a)))))) as LastOf<A, B, C, D, E, F, G, H, I, J>;
    }
    if (mapH === undefined) {
        return mapG(mapF(mapE(mapD(mapC(mapB(mapA(a))))))) as LastOf<A, B, C, D, E, F, G, H, I, J>;
    }
    if (mapI === undefined) {
        return mapH(mapG(mapF(mapE(mapD(mapC(mapB(mapA(a)))))))) as LastOf<A, B, C, D, E, F, G, H, I, J>;
    }
    return mapI(mapH(mapG(mapF(mapE(mapD(mapC(mapB(mapA(a))))))))) as LastOf<A, B, C, D, E, F, G, H, I, J>;
}

test("map once", () => {
    const result = pipe(
        2,
        i => i * 10);
    expect(result).toBe(20);
});

test("map twice", () => {
    const result = pipe(
        2,
        i => i * 10,
        i => `the answer is ${i}`);
    expect(result).toBe('the answer is 20');
});

test("map three times", () => {
    const result = pipe(
        2,
        i => i * 10,
        i => -i,
        i => ({ a: i, b: -i }));
    expect(result).toEqual({ a: -20, b: 20 });
});

๋‚˜๋Š” lodash/fp์˜ _.flow๊ฐ€ ์ด๋ฏธ ์ด๊ฒƒ์„ ์ž…๋ ฅํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

2018๋…„ 5์›” 9์ผ ์ˆ˜์š”์ผ 22:19 jmagaram์—์„œ ์•Œ๋ฆผ @github.com์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ €๋Š” Javascript์™€ TypeScript(2์ฃผ)์— ๋‹ค์†Œ ์ต์ˆ™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์–‘ํ•ดํ•ด ์ฃผ์‹ญ์‹œ์˜ค.
๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์žˆ๋‹ค๋ฉด ๋‚˜. ํ•˜์ง€๋งŒ ์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ๋‚˜์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค
ํŒŒ์ดํ”„๋ผ์ธ ์šด์˜์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ. ๋‚˜๋Š” ์›๋ž˜ ๊ฐ€์ง€๊ณ  ์‹œ๋„
2, 3, 4 ๋“ฑ ์œ ํ˜•์—์„œ ์ž‘๋™ํ•˜๋Š” ํŒŒ์ดํ”„์˜ ๋‹ค์ค‘ ๊ณผ๋ถ€ํ•˜
๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ TypeScript ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
C#์—์„œ์™€ ๊ฐ™์ด ์ž‘๋™ํ•˜๋Š” ํ•ด์ƒ๋„. ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
pipe1 , pipe2 ๋ฐ pipe3 ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ˆ˜์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ๋‹น์‹ ์ด ์›ํ•˜๋Š” ์ฃผ์žฅ.
ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ๊ท€ ์œ ํ˜• ์ •์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฌด์ œํ•œ?

์œ ํ˜• LastOf = [B] ํ™•์žฅ [๊ฒฐ์ฝ”] ?
๋‚˜ :[D] ํ™•์žฅ [๊ฒฐ์ฝ”] ?
๋”” :[F] ํ™•์žฅ [๊ฒฐ์ฝ”] ?

๊ธฐ๋Šฅ ํŒŒ์ดํ”„ ( ์—์ด: ์•„,mapA: (a: A) => B,mapB?: (b: B) => C,mapC?: (c: C) => D,mapD?: (d: D) => E,mapE?: (e: E) => F): LastOf { const b = mapA(a);์Šค์œ„์น˜(mapB) {์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ: b๋ฅผ LastOf๋กœ ๋ฐ˜ํ™˜ ; ๊ธฐ๋ณธ: {const c = mapB(b);์Šค์œ„์น˜(mapC) {์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ: c๋ฅผ LastOf๋กœ ๋ฐ˜ํ™˜ ; ๊ธฐ๋ณธ: {const d = mapC(c);์Šค์œ„์น˜(mapD) {์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ: d๋ฅผ LastOf๋กœ ๋ฐ˜ํ™˜ ; ๊ธฐ๋ณธ: {const e = mapD(d);์Šค์œ„์น˜(mapE) {์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ: e๋ฅผ LastOf๋กœ ๋ฐ˜ํ™˜ ;๊ธฐ๋ณธ๊ฐ’: MapE(e)๋ฅผ LastOf๋กœ ๋ฐ˜ํ™˜ ; }}}}}}}}

test("ํ•œ ๋ฒˆ ๋งคํ•‘", () => {
const ๊ฒฐ๊ณผ = ํŒŒ์ดํ”„(
2,
๋‚˜๋Š” => ๋‚˜๋Š” * 10);
๊ธฐ๋Œ€(๊ฒฐ๊ณผ).toBe(20);
});

test("๋‘ ๋ฒˆ ๋งคํ•‘", () => {
const ๊ฒฐ๊ณผ = ํŒŒ์ดํ”„(
2,
๋‚˜๋Š” => ๋‚˜๋Š” * 10,
๋‚˜๋Š” => the answer is ${i} );
๊ธฐ๋Œ€(๊ฒฐ๊ณผ).toBe('๋‹ต์€ 20์ž…๋‹ˆ๋‹ค');
});

test("์„ธ ๋ฒˆ ๋งคํ•‘", () => {
const ๊ฒฐ๊ณผ = ํŒŒ์ดํ”„(
2,
๋‚˜๋Š” => ๋‚˜๋Š” * 10,
๋‚˜๋Š” => -๋‚˜,
๋‚˜๋Š” => ({ a: ๋‚˜๋Š”, b: -i }));
๊ธฐ๋Œ€(๊ฒฐ๊ณผ).toEqual({ a: -20, b: 20 });
});

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/17718#issuecomment-387878691 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAZQTLm6LrWe5KVx4aGBFUd4yRUHkkrZks5tw11cgaJpZM4OzVEg
.

๋‚˜๋Š” ๋ฐฉ๊ธˆ lodash๋ฅผ ๋ณด์•˜๊ณ  ๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค. ํ๋ฆ„ ํ•จ์ˆ˜๋Š” ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„๋“ค์ด๊ณ  ๊ฐ•๋ ฅํ•œ ํ˜•์‹์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ TypeScript์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ค๋ฒ„๋กœ๋“œ์— ๋Œ€ํ•ด ํ˜•์‹ ์ •์˜ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด TypeScript์—์„œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์€์ง€ ๋‚˜์œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@jmagaram all TS๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ถ”๋ก ์œผ๋กœ ์ธํ•ด ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ ์ž‘๋™ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@jmagaram ๋‹ค์†Œ ๋‹จ์ˆœํ•œ ์ˆœ์ˆ˜ typescript ๋Œ€์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

interface IPipe<T> {
    readonly value: () => T;
    chain<R>(fn: (x: T) => R): IPipe<R>;
}

function pipe<T>(val: T): IPipe<T> {
    return {
        chain: fn => pipe(fn(val)),
        value: () => val
    };
}

์‚ฌ์šฉ๋ฒ•์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋งค์šฐ ๊นจ๋—ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

pipe(["Hello", "There"])
    .chain(map(x => `${x}!`))
    .chain(xs => {
        ...
    })
    .value()

์‚ฌ์šฉ์ž ์ง€์ • ์—ฐ์‚ฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์— ์ •๋ง ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. F#์—๋Š” ์ด์— ๋Œ€ํ•œ ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋™์•ˆ ๋‹ค์Œ์€ ๋ž˜ํ•‘ ์—†์ด ๋” ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

function pipe<T1>(first:T1):T1
function pipe<T1, T2>(first:T1, second:(a:T1) => T2):T2
function pipe<T1, T2, T3>(first:T1, second:(a:T1) => T2, third:(a:T2) => T3):T3
function pipe<T1, T2, T3, T4>(first:()=>T1, second:(a:T1)=>T2, third:(a:T2)=>T3, fourth:(a:T3)=>T4):T4
function pipe<T1, T2, T3, T4, T5>(first:()=>T1, second:(a:T1)=>T2, third:(a:T2)=>T3, fourth:(a:T3)=>T4, fifth:(a:T4)=>T5):T5
function pipe<T1, T2, T3, T4, T5, T6>(first:()=>T1, second:(a:T1)=>T2, third:(a:T2)=>T3, fourth:(a:T3)=>T4, fifth:(a:T4)=>T5, sixth:(a:T5)=>T6):T6
function pipe<T1, T2, T3, T4, T5, T6, T7>(first:()=>T1, second:(a:T1)=>T2, third:(a:T2)=>T3, fourth:(a:T3)=>T4, fifth:(a:T4)=>T5, sixth:(a:T5)=>T6, seventh:(a:T6)=>T7):T7
function pipe<T1, T2, T3, T4, T5, T6, T7, T8>(first:()=>T1, second:(a:T1)=>T2, third:(a:T2)=>T3, fourth:(a:T3)=>T4, fifth:(a:T4)=>T5, sixth:(a:T5)=>T6, seventh:(a:T6)=>T7, eigth:(a:T7)=>T8):T8
function pipe<T1, T2, T3, T4, T5, T6, T7, T8, T9>(first:()=>T1, second:(a:T1)=>T2, third:(a:T2)=>T3, fourth:(a:T3)=>T4, fifth:(a:T4)=>T5, sixth:(a:T5)=>T6, seventh:(a:T6)=>T7, eigth:(a:T7)=>T8, ninth:(a:T8)=>T9):T9
function pipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(first:()=>T1, second:(a:T1)=>T2, third:(a:T2)=>T3, fourth:(a:T3)=>T4, fifth:(a:T4)=>T5, sixth:(a:T5)=>T6, seventh:(a:T6)=>T7, eigth:(a:T7)=>T8, ninth:(a:T8)=>T9, tenth:(a:T9)=>T10):T10
function pipe(first:any, ...args:Function[]):any {
    return (
        args && args.length 
        ? args.reduce(
            (result, next) => next(result),
            first instanceof Function ? first() : first
        )
        : first instanceof Function ? first() : first
    );
}

์ด๊ฒƒ์€ ๋‹ค์Œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
ts-pipe-example
( ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค )

์ฆ‰, @graingert +1 ๋งž์Šต๋‹ˆ๋‹ค. lodash๋Š” ์ด๋ฏธ ๊ตฌ์„ฑ์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(ํŒŒ์ดํ”„๋Š” ์•„๋‹˜):

const getUpperName = 
   _.flow(
      (p: Person) => `${p.FirstName} ${p.LastName}`,
      (s: string) => s.toUpper()
   )

๋˜๋Š” ๋Œ€์‹  Object.prototype์— ํŒŒ์ดํ”„๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Object.prototype.pipe = function<Self, Result>(this:Self, next:(value:Self) => Result):Result {
    return next(this)
}

๋Œ€์‹  ๋‹ค์Œ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
capture
( ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค )

์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

--enable-pipeline-operator ์ปดํŒŒ์ผ ํ”Œ๋ž˜๊ทธ๋กœ Firefox์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Pipeline_operator

๋ชฐ๋ฝํ•œ ์˜์›…์„ ์œ„ํ•œ 1๋ถ„๊ฐ„์˜ ์นจ๋ฌต, ๋ฐ”์ธ๋“œ ์—ฐ์‚ฐ์ž :: , ์‚ฌ์•…ํ•œ |> ์œ„ํ•ด ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค ๐Ÿ˜ข

๊ธ€์Ž„, ๋‚˜๋Š” |> ์„ ํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋Š” ์‚ฌ๋žŒ์˜ ๋ˆˆ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :D

์™• ๋งŒ์„ธ!

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ—›๋œ ๊ฟˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ณธ์งˆ์ ์œผ๋กœ Identity Monad์˜ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ pipe ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ˜๋Œ€๋กœ compose ๋ฐ˜๋ฉด pipeline ๋Š” ์ฆ‰์‹œ ํ˜ธ์ถœ๋˜๋Š” pipe ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  Typescript์—์„œ ์ด๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์ด ์žˆ์œผ๋ฉด ๋„์›€์ด ๋˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€ํ™˜๊ธฐ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ์—ฐ์‚ฐ์ž(์ด๋ฆ„์— ํŠน์ˆ˜ ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๊ณ  ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์™ผ์ชฝ์— ์žˆ๋Š” ํ•จ์ˆ˜)๋ฅผ ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €์™€ ํ•จ๊ป˜ ์ด ์ž‘์—…์„ ์‹œ๋„ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๊ฑฐ๋‚˜ ์ด์— ๋Œ€ํ•œ ๋ฐฐ๊ฒฝ ์ง€์‹์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

2018๋…„ 8์›” 10์ผ ๊ธˆ์š”์ผ 02:53 Babak [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ณธ์งˆ์ ์œผ๋กœ Identity Monad์˜ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ,
ํŒŒ์ดํ”„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๋ฐ˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์€ ํŒŒ์ดํ”„์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
๋ฐ”๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  Typescript์—์„œ ์ด๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/17718#issuecomment-411824741 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AFXUx5rwM9wVrpAkHK2BNYkyy74HtWU5ks5uPGkNgaJpZM4OzVEg
.

--

์ค‘์œ„ ํ•จ์ˆ˜ ftw

2018๋…„ 8์›” 9์ผ ๋ชฉ์š”์ผ, 23:35 Ben Beattie-Hood, [email protected]
์ผ๋‹ค:

ํŒŒ์ดํ”„๋ผ์ธ์ด ์žˆ์œผ๋ฉด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ
์‚ฌ์šฉ์ž ์ •์˜ ์—ฐ์‚ฐ์ž(์ด๋ฆ„์ด
ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์™ผ์ชฝ์— ์žˆ์Œ)
์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€ํ™˜๊ธฐ. ์ €์™€ ํ•จ๊ป˜ ์‹œ๋„ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๊ฑฐ๋‚˜
์ด๊ฒƒ์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ๋ฐฐ๊ฒฝ?

2018๋…„ 8์›” 10์ผ ๊ธˆ์š”์ผ 02:53 Babak [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ณธ์งˆ์ ์œผ๋กœ Identity Monad์˜ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ,
ํŒŒ์ดํ”„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๋ฐ˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์€ ํŒŒ์ดํ”„์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
๋ฐ”๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  Typescript์—์„œ ์ด๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
<
https://github.com/Microsoft/TypeScript/issues/17718#issuecomment -411824741
,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
<
https://github.com/notifications/unsubscribe-auth/AFXUx5rwM9wVrpAkHK2BNYkyy74HtWU5ks5uPGkNgaJpZM4OzVEg

.

--

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/17718#issuecomment-411919587 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAZQTHHFbVY5uGCWl-La_P-HF7UN6xPsks5uPLk8gaJpZM4OzVEg
.

typescript์— ๋Œ€ํ•œ ์ค‘์œ„ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋Š” ๊ฑฐ์˜ typescript๋งŒํผ ์˜ค๋ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/Microsoft/TypeScript/issues/2319

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ์ •๋ง ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ TypeScript๋Š” 3๋‹จ๊ณ„๊ฐ€ ์•„๋‹Œ ํ•œ ์ถ”๊ฐ€ ์—ฐ์‚ฐ์ž๋ฅผ ๊ตฌํ˜„ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒํ™ฉ์€ ๋ฐ”๋€” ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฌผ๋ก  ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์™ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์•„์ด๋””์–ด๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ธ๊ธฐ๋„๋ฅผ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€ํ™˜๊ธฐ๋กœ ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์—์„œ๋Š” ์ž˜ ์ •์˜๋œ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@BenBeattieHood ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ babel์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ์ค‘์ด๋ฏ€๋กœ ๊ฑฐ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€ํ™˜๊ธฐ์—์„œ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์ž์˜ ๋ช‡ ๊ฐ€์ง€ ํ˜•ํƒœ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ ์ œ์•ˆ์„ ํ™•์‹คํžˆ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ๋งŽ์€ ์ƒ๊ฐ์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํƒ€์ดํ•‘๊ณผ ๊ด€๋ จํ•˜์—ฌ:

function where<T>(predicate: (x: T) => boolean) {
  return function* (items: Iterable<T>): Iterable<T> {
    for (const item of items) {
      if (predicate(item)) {
        yield item;
      }
    }
  };
}

[1, 2, 3] |> where(x=>x> 1)

ํ˜„์žฌ where(x => x > 1)([1,2,3]) x๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ถ”๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋‚ด์šฉ์€ :: op๊ฐ€ ์Šน๋ฆฌํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋˜ ํ•œ ๊ฐ€์ง€ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด (์–ธ๋œป ๋ณด๊ธฐ์—๋Š”) typescript๊ฐ€ this ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ถ”๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‰ฌ์›Œ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ์‹œ๋˜๋ฉด TS๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ถ”๋ก  ๋ฌธ์ œ ์ค‘ ์ผ๋ถ€๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘

์‚ฌ์–‘ ๋ฐ babel ๋‰ด์Šค๋ฅผ ํŒ”๋กœ์šฐํ•˜๋ฉด ์‚ฌ์–‘์ด ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. 2๊ฐœ์˜ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘์ด ํ™•์ •๋˜๋ฉด ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ํŒ€์—์„œ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์œ„ ํ•จ์ˆ˜ ftw

iirc JS๋Š” ์ด๋Ÿฌํ•œ "๋ฉ”์†Œ๋“œ"๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

iirc JS๋Š” ์ด๋Ÿฌํ•œ "๋ฉ”์„œ๋“œ"๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

@tycho01 ๋‹น์‹ ์˜ ์˜๊ฒฌ์€ ์•„๋งˆ๋„ ๋บจ์„

@BenBeattieHood ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ babel์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ์ค‘์ด๋ฏ€๋กœ ๊ฑฐ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€ํ™˜๊ธฐ์—์„œ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์ž์˜ ๋ช‡ ๊ฐ€์ง€ ํ˜•ํƒœ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ ์ œ์•ˆ์„ ํ™•์‹คํžˆ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

Babel ํŒŒ์„œ๋Š” ์ด์ œ ์Šค๋งˆํŠธ ํŒŒ์ดํ”„๋ผ์ธ ์ œ์•ˆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/babel/babel/pull/8289

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๐Ÿคฆโ€โ™‚๏ธ TypeScript๋Š” 3๋‹จ๊ณ„์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ ์šด์˜์ž ๋Š” ํ˜„์žฌ 1๋‹จ๊ณ„์ด๋ฉฐ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ •๋ณด๋Š” ์ด ์Šค๋ ˆ๋“œ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์•„๋งˆ๋„...

โš  ๊ฒฝ๊ณ : ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ๋ฌธ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ํ˜„์žฌ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๋ ค ์ค‘์ธ ๋‘ ๊ฐœ์˜ ๊ฒฝ์Ÿ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค, ๊ทธ๊ฒƒ์ด ์ œ๊ฐ€ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Waiting for TC39 ์ƒํƒœ์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์›์„ ๊ทธ๋ฆฌ๋ฉฐ ์ด๋™ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๊ทธ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ•‘!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰