๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ ์ :( ์์ฆ์ ์ ๋ง this
๋ฌด๋ฃ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก TC39 ์ ์: https://github.com/tc39/proposal-pipeline-operator
์ ์์ด ์์ง 0๋จ๊ณ๊ฐ ์๋๋ผ๋ ๊ฒ์ ์๋๋๋ค. ์ธ์ด ์๋ฏธ ์ฒด๊ณ ๋ฐ ๊ธฐํ ์ธ๋ถ ์ฌํญ์ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ์๊ฐํ๊ธฐ์ (Enum ๋ฐ ๋ชจ๋ ์์คํ ๊ณผ ๊ฐ์ ์ค๋๋ ์ ํ์ ์ ์ธํ๊ณ ) ์ฒ์์ด์ง๋ง ์ด๊ฒ์ ๊ตฌํํ๋ typescript๊ฐ ๋ ๋ง์ ๊ฐ์์ฑ์ ์ ๊ณตํ๊ณ ๋๋จธ์ง ecma ์ํ๊ณ์์ ์ด์ ๋ํ ์์๋ฅผ ๋์ผ ์ ์์ต๋๊น?
https://vanslaars.io/post/create-pipe-function/...์์ ์๊ฐ์ ์ป์ ๋๋ฝ๋ ํ์ดํ๋ผ์ธ ์ฐ์ฐ์์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค
// 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 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๊ฐ _๋จ๊ธฐ์ ์ผ๋ก_ ๊ฑฐ๋ถ๋์์ต๋๋ค.
@PublicParadise ๋๋ lodash์ flow
๋๋ Rambda์ pipe
?
์ด์จ๋ , ์ด๊ฒ์ TS์์ ์ง์๋๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ด ๋งค์ฐ ๊ต์ฅํ ๊ฒ์ ๋๋ค. ์ ๋ JS๊ฐ ์ง์ํ๋ ๊ธฐ๋ฅ์ ํจํด(ํนํ TS์ ์ ํ ์ถ๋ก )์ ์ข์ํ์ง๋ง ์ผ๋ถ ํจํด์ ์ ์ฝํ์ง ์์ต๋๋ค. RxJS ๋ฐ IxJS์ ๊ฐ์ ๋ํ TS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ๋กํ ํ์ ํ์ฅ/์์๋ณด๋ค ํฌ์ธํธ ์๋ ๊ธฐ๋ฅ ๊ตฌ์ฑ์ผ๋ก ์ด๋ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๋งค์ฐ ํด ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ํธ๋ฆฌ ์์ดํน ๋ฐ ์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์ ์ง์์ด ํจ์ฌ ํฅ์๋ฉ๋๋ค.
@felixfbecker ๋น์ ์ ramda์ pipe
ํฉ๋๊น? ๋ค์ ์๋ํด์ผ ํ์ง๋ง ์ญ์ฌ์ ์ผ๋ก ramda๋ JS-first lib์ด๋ฏ๋ก ๋งค์ฐ ๋์ ์ด๊ณ ์
๋ ฅํ๊ธฐ ์ด๋ ต์ต๋๋ค(lodash์ ๊ฐ์). TS๊ฐ ํจ์ ๋ฐํ ๊ฐ์์ ์ถ๋ก ํ๋ ๋ฐ ๋ง์ ์ด๋ ค์์ ๊ฒช์๋ค๋ ์ฌ์ค ๋๋ฌธ์ ๋ณตํฉ์ ์
๋๋ค. ์ต๊ทผ์ ์์ ๋์์ง๋ง ํ์คํ์ง ์์)
lodash
๋ ์๋ชป ์ค๊ณ๋์ด ํ๋์ ํฐ ๋ค์์คํ์ด์ค์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ธฐ๋ฅ๊ณผ ๋ณ๊ฒฝํ ์ ์๋ ๊ธฐ๋ฅ์ ํผํฉํ์ฌ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๋น์ ์ ๊ธฐ๋ฅ๊ณผ ์ฌ์ฌ์ด ์์ฃผ ์ด์ํ์ง ์๋ค๋ฉด ๊ทธ๊ฒ์ ์ค์ ๋ก ์ ์๋ํฉ๋๋ค:
๋น์ ์ ๊ธฐ๋ฅ๊ณผ ์ฌ์ฌ์ด ์์ฃผ ํ๋ฅญํ์ง ์๋ค๋ฉด ๊ทธ๊ฒ์ ์ค์ ๋ก ์ ์๋ํฉ๋๋ค.
์ฌ๊ธฐ์์ '๋งค์ฐ ๋ฏธ์น ๊ฒ์ด ์๋๋๋ค'๋ผ๋ ์๊ฒฉ์ ๋ถ์ฌํ๊ฒ ์ต๋๋ค. ํจ์์ ์ ๋ค๋ฆญ์ด ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค(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
);
}
์ด๊ฒ์ ๋ค์์ ์ ๊ณตํฉ๋๋ค.
( ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค )
์ฆ, @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)
}
๋์ ๋ค์์ ํ์ฉํฉ๋๋ค.
( ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค )
์ด๊ฒ์ด ๋ค๋ฅธ ์ฌ๋๋ค์ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
--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 ํ์๋ ์ด์ ์ค๋งํธ ํ์ดํ๋ผ์ธ ์ ์์ ์ง์ํฉ๋๋ค.
์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
๐คฆโโ๏ธ TypeScript๋ 3๋จ๊ณ์ ๋๋ฌํ ๋๊น์ง ์ ์์ ๊ตฌํํ์ง ์์ต๋๋ค. ํ์ดํ๋ผ์ธ ์ด์์ ๋ ํ์ฌ 1๋จ๊ณ์ด๋ฉฐ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํด๋น ์ ๋ณด๋ ์ด ์ค๋ ๋์์ ์ฌ๋ฌ ๋ฒ ์ ๊ณต๋์์ต๋๋ค.
์ฌ๊ฐํ ๋ฌธ์ ์ ์๋ฅผ ๋ค์ด ์ฃผ์๊ฒ ์ต๋๊น?
โ ๊ฒฝ๊ณ : ํ์ดํ๋ผ์ธ ๊ตฌ๋ฌธ์ ์ธ๋ถ ์ฌํญ์ ํ์ฌ ๋ถ์์ ํฉ๋๋ค. ๊ณ ๋ ค ์ค์ธ ๋ ๊ฐ์ ๊ฒฝ์ ์ ์์ด ์์ต๋๋ค.
๋ค, ๊ทธ๊ฒ์ด ์ ๊ฐ ์ฌ๊ฐํ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ๋๋ค.
Waiting for TC39 ์ํ์ ๋ชจ๋ ์ค๋ ๋๊ฐ ์์ ๊ทธ๋ฆฌ๋ฉฐ ์ด๋ํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฏ๋ก ์ด ์ค๋ ๋๋ฅผ ์ ๊ทธ๋ ค๊ณ ํฉ๋๋ค.
ํ!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ง๊ธ 1๋จ๊ณ์์