Typescript: 提案されたESNext "|>"パむプラむンオペレヌタヌをサポヌト

䜜成日 2017幎08月10日  Â·  79コメント  Â·  ゜ヌス: microsoft/TypeScript

ES Next Suggestion Waiting for TC39

最も参考になるコメント

今はステヌゞ1です

党おのコメント79件

私のお気に入りの提案:(今日、私たちは本圓にthis無料プログラムを曞くこずができたす。

参考たでに、TC39の提案 https 

提案はただステヌゞ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の2぀の異なる制限から来おいたす。

1぀目は、回避するのが非垞に難しく、蚀語で察凊するこずさえ困難です。぀たり、組み蟌みオブゞェクトを衛生的な方法で拡匵できないこずです。

ただし、2぀目は蚀語レベルのサポヌトをたったく必芁ずせず、実際に修正するこずができたす。暙準ラむブラリは芪切に貧血ず呌ぶこずができたす。

MaximallyMinimalは完党な倱敗です。

蚀語でArray.prototype.flatMapを取埗するのに、なぜ䜕ヶ月も䜕ヶ月もの議論が必芁なのですか

これは1぀の方法であり、最初から存圚しおいる必芁があり、远加する必芁があるこずは明らかです。

たぶんArray.prototypeは6幎以内にgroupByメ゜ッドを持぀でしょう。

これたでに、これにはいく぀かのbabelの実装があり、TC39の提案に沿っお圹立぀こずを願っおいたす。

今はステヌゞ1です

それで、この矎しさがTSに入るチャンスはありたすか Fず䞀臎したす。 <3

䟋倖はありたすが、プロポヌザルがTypeScriptずタむプにずっお_重芁_である堎合、プロポヌザルは通垞、TypeScriptのTC39ステヌゞ3に到達するたで実装されたせん。これは、プロポヌザルが十分に安定しおいないため、重倧な砎損やリグレッションが発生しないこずを保蚌するためです。

コアチヌムの誰もこの問題に぀いおただコメントしおいたせんが、ステヌゞ3の前に実装を怜蚎するのに十分な_重芁_ではないず思いたす。最も重芁なのは、TC39でチャンピオンず提案をサポヌトするこずです。

TSだけがこの挔算子をパむプで぀なぐオプションを持っおいれば、プラグむンを備えたbabelがそれを凊理できるようになりたす。
たたは、post-cssのように独自の構文プラグむンがありたした。 プリミティブ挔算子を埅぀のに数幎かかるのは倚すぎたす。

@garkin ここでの課題は、TSが型安党性を提䟛する仕事をするためにコヌドを理解する必芁があるこずです。これは、理解できないランダムなコヌドずうたく組み合わされたせん。 マクロ4892を取埗する堎合を陀いお、マクロを取埗する堎合は、コヌドにコンパむルするだけで理解できたす。 しかし、暙準ラむブラリのかなりの数のビットがただatmを入力するのが難しいので、ロヌドマップではただそれを期埅しおいたせん。

Babelがtypescriptを理解したので、Babelを実行できたす。
typescript

2017幎10月26日19:01、「TychoGrouwstra」 [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がtypescriptを理解したので、Babelを実行できたす。
typescript

ビルド時間の2倍p

typescriptが単なるBabelプラグむンであれば、必芁はありたせん。
䞡方のプログラムをパむプで぀なぐ

2017幎10月26日20:16、「AlexGalays」 [email protected]は次のように曞いおいたす。

Babelがtypescriptを理解したので、Babelを実行できたす。
typescript

ビルド時間の2倍p

—
スレッドを䜜成したため、これを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/Microsoft/TypeScript/issues/17718#issuecomment-339769856 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAZQTEArBw8jj0BcZFM2yLj5ErfbtNrgks5swNqagaJpZM4OzVEg
。

@graingert 持っおいるのは良いオプションです、私はこれを調査したす。
残念ながら、VisualStudioCode、Webstorm、およびその他のIDEで䜿甚されるtypescript Language ServiceAPIでは機胜したせん。

「TSプラグむン」に関しおは、たずえば、TS構文を理解し、ステヌトメントず同等の匷い型を生成するパむプ挔算子甚の単玔な事前トランスパむラヌを䜿甚しお、目的の結果を簡単に達成できたす。 型チェックなどで問題なくコンパむルできたす。

そのためのWebpack構成は、次のようになりたす。

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

@garkinが指摘しおいる

おそらく、TSサヌビスのNFRを䜜成しおたたはすでに1぀あるのでしょうか、゜ヌスファむルずコンパむラにフィヌドされるトランスパむルされた結果の間に適甚される环積゜ヌスマップをサポヌトする堎合、このプラグむンや他のプラグむンは、コミュニティの残りの郚分、そしお最も重芁なこずずしお、コアチヌムが察凊するための耇雑さを远加するこずなく。


たた、13940がこれにどの皋床関連しおいるかはわかりたせんが、より耇雑なプラグむンに向けた良いスタヌトずなるようです。 ただし、ミニマルなプレトランスパむラヌはほずんどの堎合プロゞェクトコンテキストを必芁ずしないため、゜ヌスマップアプロヌチはさらに単玔な代替手段であるように思われたす。生のテキストを蚘述し、制埡フロヌがトランスパむルされた郚分の特定のI / Oタむプを暗瀺できるように曞き盎したす。


最埌になりたしたが、この皮のプラグむンに関する_official_スレッドある堎合を誰かに教えおもらえたすか

私は、新しい提案を導入する穏やかな方法に本圓に感謝し、Flow + BabelやPost-CSSの特別なプラグむンオリンピックよりもモノリシックなTypescriptずLessCSSツヌルをはるかに奜むず蚀う必芁がありたす。

これは、カスタマむズ性ず、肥倧化した断片化のコストず専門分野で新しい機胜を取埗する速床です。

パむプオペレヌタヌは、機胜の䞖界ぞの入り口の薬のようなもので、奇劙なこずを蚀わせおほしいず思いたす。

したがっお、14419があり、すでにいく぀かの有甚な実甚的な意味がありたす。 それらをts-loaderず統合するのは難しいこずではありたせん。

tsconfig.jsonトランスフォヌマヌの統合および、カスタマむズされたtscだけでなく、Language Service API14654は_短期的に_拒吊されたした。

11976は、リンティング専甚ツヌルのように芋える蚀語サヌビスプラグむンに぀いお議論しおいたす。

トランスフォヌマヌぞのこれらのプラグむンの拡匵を提案する16607。

@PublicParadiseたたはlodashのflowたたはRambdaのpipeたすか

ずにかく、これはTSでサポヌトされおいるのを芋るのはずおも玠晎らしいでしょう。 JSがサポヌトする機胜パタヌン特にTSの型掚論は気に入っおいたすが、䞀郚のパタヌンはあたり読みやすくありたせん。 RxJSやIxJSのような倧きなTSラむブラリは、プロトタむプの拡匵/継承よりもポむントフリヌの機胜構成に移行しおいるため、これは非垞に倧きなものになりたす。これにより、ツリヌの揺れずカスタム挔算子のサポヌトが倧幅に向䞊したす。

@felixfbeckerあなたはpipe意味したすか もう䞀床詊す必芁がありたすが、歎史的には、ramdaはJSファヌストのラむブラリであり、非垞に動的で入力が難しくlodashのように、TSが関数の戻り倀から掚枬するのに倚くの問題を抱えおいたずいう事実が加わっおいたす最近修正されたしたが、確かではありたせん
lodashは蚭蚈が䞍十分で、1぀の倧きな名前空間に可倉関数ず䞍倉関数が混圚しおいるため、䜿甚したせん。

関数ずチェヌンが非垞にクレむゞヌでない堎合、実際には適切に機胜したす。

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)たす。

たた、明確にしたしょう。提案はステヌゞ1です。コアチヌムは、ステヌゞ3の前に物事を玹介するこずにさらに恥ずかしがり屋になっおいたす。デコレヌタは䟋の䞀郚です。 それらが_experimental_ずしおマヌクされおいたずしおも、私たちは皆先に進んでそのフラグを有効にし、それらを䜿甚しおすべおの本番コヌドを䜜成したした。 提案は今や跳ね返り、構文ずセマンティクスにいく぀かの根本的な重倧な倉曎がありたす。これは、コアチヌムをタむトな状況に眮くコヌドをリファクタリングする必芁があるこずを意味したす。誰もがそれをリリヌスした日に構文が壊れおいるか、レガシヌのものを保持しおいる堎合、コンパむラの他の倉曎により2぀の構文のサポヌトが困難になる可胜性があり、最終的には叀いものを削陀したいのですが、い぀.. .💥💥

したがっお、このような暙準ベヌスの機胜を䜿甚するための最善の方法は、TypeScriptのサポヌトやサポヌトの欠劂に぀いおここで議論するこずではなく、フレンドリヌなロヌカルTC39担圓者を芋぀けお、この機胜があなたにずっお本圓に重芁であり、参加するこずを提唱するこずです。 GitHubで䞊蚘にリンクされおいる提案の䌚話。 セマンティクスがより早く解決され、ステヌゞ3に到達するのがより速くなるず、私たち党員がより早く玠晎らしいものを手に入れるこずができたす

rxjsにlettable挔算子が远加されたので、これはTypescriptにあるさらに玠晎らしい機胜になりたす。
https://github.com/ReactiveX/rxjs/blob/master/doc/lettable-operators.md

TSチヌムの誰かに、このリク゚ストに光を圓おおもらうこずはできたすか

持っおいる、圌らはそれにES NextずSuggestionタグを付けたした...私はあなたに章を匕甚し、ESNextの提案に぀いおコメントした他の堎所ずそれらをい぀どのように実装するかを説明するこずができたす...

圌らからのコメントは䜕も倉わりたせん。 圌らは舞台裏で密かに取り組んでいお、コミュニティでそれが生たれるのを埅っおいるず思いたすか 远加するものがない堎合、圌らは問題に぀いお入力しないこずがよくありたす...すでに蚀われおいるこずに远加するものはありたせん。

この時点で、蚀語を拡匵するプラグむンがあるず非垞に䟿利だず思いたす。 蚀語のコアの䞀郚にならない機胜を远加するず、これらのプラグむンの䞀郚になりたす。

@aminpaksすぐにバベルの塔に぀ながる可胜性があるため、このアむデアはあたり奜きではありたせんバベルの塔のように、優れたトランスパむラヌのバベルの塔ではありたせん😀

プラグむンはタむプレベルの動䜜を意味するため、プログラムの意味を理解するこずは困難になり、゜ヌスレベルの䟝存関係を凊理するには、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;
  }
}

bind-op

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

パむプラむン操䜜

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

ts-teamは、ステヌゞ3たで気にしないで正しいです。 その堎合でも、ステヌゞ3の提案は取り消すこずができたすSIMDなど。 プラグむンを持おないのは残念ですが、「リスク」は個々の開発者に枡されたす。 プラグむンのナヌスケヌスは他にもたくさんありたす。特に、typescriptを含む.vueファむルなどをサポヌトする堎合

@MeirionHughes同意したす。 砂糖をたったく䜿わないよりもパむプラむン挔算子を䜿いたいのですが、関数が自動カレヌされ、それを利甚しおラむブラリが構築されおいる蚀語に觊発されおいたす。 たた、パむプラむンメ゜ッドがパむプラむン倀のメンバヌではないこずも前提ずしおいたす。

だからあなたは

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は関数を自動カリヌ化しないため、自動カリヌ化できないため、カリヌ化を念頭に眮いお蚭蚈されたラむブラリでのみうたく機胜するようです。

私はこれに぀いお誀解されおいるかもしれたせん、私は提案に぀いおあたり最新ではありたせん。

次に、デフォルトでカレヌされたutil関数を提䟛する新しいラむブラリが新しい暙準になる可胜性がありたすp

@AlexGalaysこれが合栌すればそうなるず思いたす。 JavaScriptをOCamlに倉えるこずは砎壊的な陰謀の䞀郚でない限り、すべおが順調です。

@MeirionHughesあなたの䟋は正しくありたせん。 where関数はthisをたったく䜿甚しないため、バむンド挔算子は機胜したせん。 バむンド挔算子には、型の安党性に関する倚くの未解決の質問もありたす。 where thisは、クラスメ゜ッドのようにthisを䜿甚する意味は䜕ですか はいの堎合、私有財産の倉曎は突然、重倧な倉曎ずなり、私有財産の目的を完党に無効にしたす。
たた、構文が読みにくいず述べおいたすが、たずえば、bind-operatorの䟋では芪を省略し、パむプラむンの䟋では䞍芁な芪を远加しおいたす。 もちろん、パむプラむン挔算子は、バむンディング甚に蚘述された関数ではたったく機胜したせんが、rxjs挔算子、ramda、lodash / fpなどのカリヌ化された関数ではうたく機胜したす。

@aluanhaddadすべおのfpラむブラリに加えお、RxJSは、プロトタむプの挔算子䞻にツリヌの揺れやゞェネリック型の安党性に関しお倚くの問題があるからカレヌ関数ずしおの挔算子に移行した、広く䜿甚されおいるラむブラリの䟋です。 ほずんどのラむブラリは、おそらく珟圚その方法を遞択しおいたせん。なぜなら、適切な構文がないためです。

@felixfbeckerはその通りであり、パむプされる結果の関数をネストする@aluanhaddadの䟋は、私の考えを完党に倉えたした。

パむプラむンのサポヌトを少し早く取埗するために、カスタムトランスフォヌマヌに぀いお考えた、たたは実装しおいる人はいたすか 芋た目からは、パむプラむン郚分自䜓にバベルトランスパむルを远加するだけのカスタムトランスフォヌマヌを介しお実行できたす。 その埌、 https  たす。

それは可胜ですか TypeScriptsツヌルのようなものを機胜させながら、カスタム倉換を䜿甚しおBabelでサポヌトされおいるサポヌトされおいる構文を䜿甚したすか

倚分 0-2の提案のみを扱うプリセットがありたす https//github.com/cevek/ttypescript#visual -studio-codeを䜿甚するず、問題が解決する堎合がありたす。

@MeirionHughesお圹に立おおうれしいです❀。
これで、任意のプロトタむプのメ゜ッドをカリヌ化された関数に倉換できるように、6606が必芁になりたす。

TypeScriptは珟圚、バベル倉換です。TypeScriptがパスする前に、パむプラむンで脱糖をシヌケンスする方法があるはずです。 ただし、蚀語サヌバヌでそれをどのように機胜させるかはわかりたせん。

TS22816のセルフホスト実装を远加したした

パむプラむンオペレヌタヌを掚進しおいる人の䞀人ずしお、私はあなたにお願いしたすそれがさらに進むたで、TypeScriptでこれを実装しないでください。 根本的に盞互に互換性のない2぀の朜圚的な提案に぀いおはただ議論䞭です。そのため、TypeScriptは、これを実装するのが早すぎるず、䞖界に苊痛を求めおいたす。

この提案に興味がある堎合は、こちらのリポゞトリをご芧になり、参加しおください //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 

@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、 notifications @ github.comは次のように曞いおいたす。

私はJavascriptずTypeScriptに少し慣れおいたせん2週間のでご容赊ください
もっず簡単な解決策があれば私に。 しかし、以䞋は私が思い぀いたものです
パむプラむンオペレヌタヌがいない堎合。 私はもずもず持っおみたした
2、3、4などのタむプで機胜したパむプの耇数の過負荷
パラメヌタが、TypeScriptオヌバヌロヌドを取埗する方法を理解できたせんでした
Cず同じように機胜する解像床。 私たちはさたざたな機胜を持぀こずができたす
pipe1 、pipe2 、pipe3ですが、これは難しいでしょう数に基づいお関数名を遞択する必芁があるため、あなたが望んでいた議論。
を受け入れるこずができる再垰型定矩はありたすかパラメヌタの無制限のアンバヌ

タむプLastOf = [B]は[決しお]拡匵したせんか
B[D]は[決しお]拡匵したせんか
D[F]は[決しお]拡匵したせんか

機胜パむプ aA、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 "map once"、=> {
const result = pipe
2、
i => i * 10;
expectresult.toBe20;
};

test "マップを2回"、=> {
const result = pipe
2、
i => i * 10
i => the answer is ${i} ;
expectresult.toBe '答えは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};
};

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/Microsoft/TypeScript/issues/17718#issuecomment-387878691 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAZQTLm6LrWe5KVx4aGBFUd4yRUHkkrZks5tw11cgaJpZM4OzVEg
。

lodashを芋たずころ、あなたは正しいです-flow関数は倚くのパラメヌタヌを受け入れ、匷く型付けされおいたす。 Iitは玔粋な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

倒れた英雄、バむンド挔算子::の黙祷は、邪悪な|>を支持しお閉じられたした😢

私は|>を奜むので、それは芋る人の目にあるず思いたすD

王に歓呌

そしおここで私はそれがパむプの倢だず思った

パむプラむンは、基本的にIdentityMonadの単玔なナヌスケヌスです。 たた、 pipeは通垞逆にcomposeが、 pipelineはすぐに呌び出されるpipe䌌おいたす。

ずにかく、Typescriptでこれを芋るのを楜しみにしおいたす。

パむプラむンがあるず䟿利ですが、コンパむラトランスフォヌマヌを介しおカスタム挔算子名前に特殊な文字が含たれる可胜性があり、最初のパラメヌタヌが巊偎にある関数を定矩する機胜を提䟛できるず思いたす。 私ず䞀緒にこれを詊すこずに興味がある人、たたはこれに関する背景がありたすか

金、2018幎8月10日には、午前2時53分ババクの[email protected]は曞きたした

パむプラむンは、基本的にIdentityMonadの単玔なナヌスケヌスです。 たた、
パむプは通垞逆に構成されたすが、パむプラむンはパむプのようなものです
それはすぐに呌び出されたす。

ずにかく、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、 notifications @ github.com
曞きたした

パむプラむンがあるず䟿利ですが、それは可胜だず思いたす
カスタム挔算子名前が
特別な文字を含み、その最初のパラメヌタは巊偎にありたす
コンパむラトランス。 私ず䞀緒にこれを詊すこずに興味がある人、たたは持っおいる人
これに関するいく぀かの背景

金、2018幎8月10日には、午前2時53分ババクの[email protected]は曞きたした

パむプラむンは、基本的にIdentityMonadの単玔なナヌスケヌスです。 たた、
パむプは通垞逆に構成されたすが、パむプラむンはパむプのようなものです
それはすぐに呌び出されたす。

ずにかく、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 

倚くの人がこれを本圓に悪いこずを望んでいるこずは知っおいたすが、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が勝぀こずを望んでいた理由の1぀です。なぜなら、䞀芋するずtypescriptがthisが䜕であるかを掚枬するのがはるかに簡単に芋えるからです。

たたは、別の方法で芋るこずができたす。リリヌスされた堎合、TSが抱える掚論の問題のいく぀かが優先されたす👍

スペックずバベルのニュヌスをフォロヌするず、スペックはただ蚭定されおいたせん。 2぀の提案がありたす。 仕様が完成したずきに、typescriptチヌムがサポヌトを远加するず確信しおいたす

䞭眮関数ftw

iircJSはこれらを「メ゜ッド」ず呌んでいたす。

iircJSはこれらを「メ゜ッド」ず呌んでいたす

@ tycho01あなたのコメントはおそらく頬の舌ですが、これらはたったく同じものではないず思いたす。 バむナリ関数をどこかから゚クスポヌトしお、2぀の倀にむンフィックスで適甚するこずはできたせん。 倀を操䜜するすべおの関数に関する知識は、盎接プロパティずしお、たたはプロトタむプずしお、倀自䜓に移怍する必芁がありたす。 これは実際のシナリオではかなり䞍䟿です。

@BenBeattieHoodこれをbabelで実装しおいる

Babelパヌサヌは、スマヌトパむプラむンの提案をサポヌトするようになりたした。

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

曎新はありたすか

曎新はありたすか

🀊‍♂TypeScriptは、ステヌゞ3に到達するたで提案を実装したせん。パむプラむンオペレヌタヌは珟圚ステヌゞ1であり、重倧な問題がありたす。 その情報は、このスレッドで耇数回提䟛されおいたす。

深刻な問題の䟋をお願いしたすか

倚分...

⚠譊告パむプラむン構文の詳现は珟圚未解決です。 怜蚎䞭の2぀の競合する提案がありたす。

はい、それは私が深刻な問題だず考えおいるこずです。

Waiting for TC39ステヌタスのすべおのスレッドは円ため、これをロックしたす。

ping

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡