Typescript: 提案「安党なナビゲヌション挔算子」、぀たりx.y

䜜成日 2014幎07月15日  Â·  205コメント  Â·  ゜ヌス: microsoft/TypeScript

珟圚のステヌタス

  • TC39の提案は珟圚ステヌゞ3にありたす🎉🎉🎉🎉🎉
  • 実装が進行䞭です
  • TypeScript3.7でこの機胜を期埅できたす
  • ナむトリヌビルドで利甚可胜になったら、ここで曎新したす
  • 委員䌚でそのセマンティクスが明らかになるたで、オプションの呌び出しを保留したす

未解決の質問

  • document.allは、どのような特殊ケヌシングを取埗する必芁がありたすか

Cおよびその他の蚀語には、オブゞェクト階局の任意のポむントでnull たたはこの堎合はundefined が怜出される可胜性のあるプロパティチェヌンにアクセスするためのシンタックスシュガヌがありたす。

var x = { y: { z: null, q: undefined } };
console.log(x?.y?.z?.foo); // Should print 'null'
console.log(x?.baz); // Still an error
console.log(x.y.q?.bar); // Should print 'undefined'

アクセサの副䜜甚を念頭に眮いお、正確に䜕をコヌディングする必芁があるかに぀いおの提案が必芁です。


@DanielRosenwasserによる線集2018幎2月27日この提案は「ヌル䌝播」挔算子ずも呌ばれたす。

Committed ES Next Suggestion Update Docs on Next Release

最も参考になるコメント

オプションの連鎖はステヌゞ3です

お祝いの目的でのみこれを簡単にロック解陀したす

党おのコメント205件

したがっお、最初の䟋では、次のように出力する可胜性がありたす。

x && xy && xyz && xyzfoo

しかし、どういうわけか、x、y、z、およびfooをそれぞれ最倧で1回評䟡する必芁がありたす。

たた、倚くの堎合、実際には&&を実行できたせん。これは、プリミティブにずっお真実性が少し問題になるためです。

䟋えば

"     "?.trim()?.indexOf("hello")

""を䞎えたす。

したがっお、型システムを利甚しない限り、䞀般的なケヌスでは== $を䜿甚しおnullず明瀺的に比范する必芁がありたすこれを芋るずかなりクヌルです。

おそらく、monadic-bind関数JS出力にはきれいではありたせんを発行するか、䞉項挔算子通垞のJSの同等物に近いで䜕らかの倉換を䜿甚するこずができたす。 私は明らかに埌者に少し偏っおいたす。

それに぀いおのesdiscussでの議論はほずんどありたせんでした

+1

実際に0 / ""を䜿甚するかどうかに぀いおの正確なセマンティクスに぀いおはおそらく意芋の盞違があるため、ES7たたはES8たたはES9たたは...で最初にこれを実装するのが理想的です。ここでの挔算子の目的のための停のプリミティブずしおの

+1TypeScriptがESxxを埅たずにこれを最初に取埗するこずを望んでいたす。

「」のような単玔でめちゃくちゃ䟿利なnull-safety挔算子ずいう事実。 そしお「」ES6仕様に含たれおいないずいうこずは、ES6仕様をたずめる人々が恥ずかしそうに頭を䞋げおいるべきであるこずを意味したす。 これは非垞に単玔で明癜なこずなので、それを組み蟌たないこずは率盎に蚀っお非垞識です。 ほずんどの珟代蚀語がこれらをサポヌトする理由がありたすそれらは䞍可欠です。

これは珟圚の仕様からの逞脱であるず私は理解しおいたす珟圚の仕様はこれを省略しおいるほど近芖県的であるため。 しかし、それはずお぀もなく䟿利なので、この単䞀の逞脱は正圓化されるず思いたす。 TS開発者の倧倚数VASTは、これが最終的にES仕様に远加された堎合、たたはそのずきに、実装ぞの小さな倉曎の圱響を受けたせん。 これが提䟛する倧きなメリットは、ごく䞀郚の開発者に将来的に圱響を䞎える可胜性がある䟡倀がありたす。 そしお、笑えるほど遅いES仕様プロセスを考えるず、これは少なくずも数幎間はたったく問題になりたせん。

私はbrain428に完党に同意したす

@ brian428ここでの問題は、その挔算子がES7に実装されおいる可胜性があるため、typescriptが最終的なES7の仕様ずは異なる仕様になっおいる堎合、誰も満足しないこずです。

ここでの問題は、その挔算子がES7に実装されおいる可胜性があるため、typescriptが最終的なES7の仕様ずは異なる仕様になっおいる堎合、誰も満足しないこずです。

TypeScriptは、ESの方向性に圱響を䞎えるための有甚なテストベッドずなるため、将来のESバヌゞョンに_朜圚的に_たたはそうでない可胜性のある機胜を実装する方が、より積極的なアプロヌチだず思いたす。

TypeScriptの圱響を受けおいるESディスカッションの䟋を次に瀺したす。

コンストラクタヌのパラメヌタヌの1぀にプラむベヌトプレフィックスを介しお宣蚀および初期化するTypeScript ...オプションは、倚くの開発者に圹立ちたす

さらに、ESがTypeScriptにすでに存圚する機胜を採甚するこずは確かに可胜ですが、セマンティクスは異なりたすたずえば、モゞュヌルの動䜜方法など。

ESがTypeScriptにすでに存圚する機胜を採甚するこずは確かに可胜ですが、セマンティクスは異なりたす

これは最悪のシナリオであるず広く考えおいるこずに泚意しおください。 TypeScript 1.0を宣蚀する前に、ES6のモゞュヌルを完成させたかったのですが、委員䌚のスケゞュヌルの遅れにより、それができたせんでした。 これは、繰り返されるのではなく、避けるべきものです。 ES7 +になる可胜性が最倧0タむプアノテヌションなどであるか、簡単に定矩されたセマンティクス倪い矢印が2である堎合などで機胜する可胜性が最倧100の機胜をヒットさせたいず考えおいたす。数幎前。 新しいオペレヌタヌは厄介な䞭間に陥る可胜性がありたす。

最悪の堎合、ES7が異なる堎合、コンパむラフラグはレガシヌTS実装をサポヌトし、猶予期間を提䟛できたすか これず明確な移行ドキュメントを組み合わせるこずで、開発者は新しい暙準ぞの簡単なルヌトを提䟛できるはずです。

最終的に、そのような機胜の䜿甚は、めちゃくちゃ䟿利ですが、開発者にずっお必須ではありたせん。 TSは、その䜿甚法の朜圚的な将来の圱響を初日から十分に明らかにする必芁がありたす。 朜圚的なマネヌゞドリファクタリングのアむデアは奜きではありたせん。䜿甚しないでください。 おそらく、このメッセヌゞを匷制するためのオプトむンコンパむラフラグですか

TSはESに圱響を䞎えたいず思っお暎れるべきではありたせんが、このような小さな孀立したケヌスでは、TSが完党に恥ずかしがるのは残念です。

たぶん、これに関するストロヌマンの提案をたずめお、-harmonyフラグたたはそのようなものの背埌にリファレンス実装を眮くこずができたす。 そうすれば、この機胜のES7開発を掚進できたす。

繰り返しのルックアップによる副䜜甚を防ぐために、コンパむラヌは䞀時倉数を出力する必芁がありたす。

($tmp0 = x, $tmp0 === void 0 ? void 0 : 
    ($tmp1=$tmp0.y,  $tmp1 === void 0 ? void 0 : 
        ($tmp2 = $tmp1.z,  $tmp2 === void 0 ? void 0 : $tmp2)))

たたは、 Proxyに基づくメモ化メンブレンを䜿甚したす。

カテゎリの芳点からは、これはプロパティルックアップに適甚されるモナドである可胜性があるため、すべおのプロパティルックアップが未定矩を返す可胜性がある蚀語にずっおは非垞に自然な機胜です。 ES7が䞊蚘のコヌドで説明されおいるもの以倖のセマンティクスを採甚した堎合は驚きたす。

codeplexの問題にはかなりの数の祚がありたした61

atom-typescriptにatomを䜿甚する手間を軜枛するために、これは本圓にひどく必芁です。

これは、coffescriptコヌドでは非垞に慣甚的ですただし、決定論が厄介な?よりも優れおいるので人気がないようにしたいず思いたす。 coffescriptファむル、特にスペヌスペンのようにDOMず盎接連携するファむルビュヌが砎棄された埌、たたはビュヌがアタッチされる前に関数を実行できるファむルを開くず、膚倧な数の?の䜿甚法が芋぀かりたす。 たずえば、このファむルには16 https//github.com/atom-community/autocomplete-plus/blob/f17659ad4fecbd69855dfaf00c11856572ad26e7/lib/suggestion-list-element.coffeeがありたす

繰り返しになりたすが、これが必芁なのは奜きではありたせんが、JavaScriptの状態であり、100䞇ドルよりも?の方がいいですif( && fest ) { then }

しかし、コヌドを読みやすくするために本圓に必芁です。 たた、XHRが完了し、ダむゞェストルヌプが角床で実行されるのを埅っおいるずきに、これが「必芁」になるこずもよくありたす。

さお、スレッドを読んで、なぜ埅っおいるのかを確認したした。 私は_ため息_を理解しおいたす。

we'd have to somehow make x, y, z, and foo each evaluate at most once.

Coffeescriptはいく぀かの最適化を行いたす。たずえば、䞭間アクセス結果を保存したす。

typeof foo !== "undefined" && foo !== null ? (ref = foo.bar) != null ? ref.baz() : void 0 : void 0;

私はundefinedチェックがtypescriptには䞍芁だず匷く感じおいたすtypescriptによっおvar initタむプチェックが必芁なので

+1

今日のニュヌスでは、ダヌトはそれに察する公匏のサポヌトを受けおいたす https //github.com/gbracha/nullAwareOperators/blob/master/proposal.md

非垞に重芁な機胜。

おそらくオフザりォヌルのアむデアですが、キヌ付きプロパティアクセスで機胜を凊理しおも問題ないず誰もが刀断した堎合、この機胜のコヌド生成は副䜜甚なしで非垞に簡単に実行できたす。

if (aaa?.bbb?.ccc) {}

にコンパむルできたす

if (__chain(aaa, "bbb", "ccc")) {}

__chain関数は、 __extendsず同様に発行する必芁がありたす。 __chain関数は、 arguments配列を反埩凊理するだけで、次のメンバヌがinstanceof Objectでない堎合、たたはメンバヌ名が含たれおいない堎合にnullを返したす。 関数呌び出しは、配列をパラメヌタヌずしお枡すこずでそしお、内郚.apply()を䜿甚しお凊理できるため、...

if (aaa?.bbb?.ccc?(1, 2, 3)) {}

にコンパむルできたす

if (__chain(aaa, "bbb", "ccc", [1, 2, 3])) {}

これにより、長いチェヌンの堎合でも、生成されたJSがかなり慣甚的になりたす。

明らかに掗緎が必芁です...しかし、おそらくここに䜕かがありたすか

aaa?.bbb?.ccc?がa.b.cの倀を返す堎合、すべおの小道具が存圚し、それが関数である堎合は、できたせんでした

if (aaa?.bbb?.ccc?(1, 2, 3)) {}

にコンパむルする

if (__chain(aaa, "bbb", "ccc")(1, 2, 3)) {}



@metaweta あなたの゜リュヌションはvoid 0をチェックするだけです...そのような皮類の機胜の目的を打ち負かしたせんか

これはどうですか

var result = one?.two?.three;

生成

var $a, $b, $c;
var result = $a = one, $b = $a ? $a.two : void 0, $b ? $b.three : void 0;

私はこれがすべおのケヌスを凊理するず確信しおいたす。 関数呌び出しにはおそらくinstanceof Functionチェックが必芁です。

予期しないロヌカル倉数が攟出されるずいうここでのマむナヌな欠点...倚分IIFEでラップされる可胜性がありたす

@ kevinb7  cccが関数でない堎合はどうなりたすか 説明したコヌドでは、 __chainは垞に有効な関数を返す必芁がありたす。そうしないず、TypeErrorが発生したす。

@ Back-ioプロパティが存圚しない堎合、ルックアップはundefined === void 0を返したす。゜リュヌションは、空の文字列やれロなどの誀った倀のプロパティのルックアップに倱敗したす。

@metaweta いいえ、そうではありたせんhttp //jsfiddle.net/25LppbL6/

たた、䞀郚の人々のリンタヌがそれに察しお譊告しおいるずいう事実のために、TSチヌムは緩い平等を䜿甚するこずに倢䞭ではないず思いたす。

@ Back-ioはい、そうですhttp //jsfiddle.net/25LppbL6/2/

@ Back-io nullに関しおは、a.bの意図されたセマンティクスが䜕であるかわかりたせん。 「プロパティbが定矩されおいる堎合はそれを䜿甚する」の堎合、私のコヌドはほが正しいです。 nullを取埗する唯䞀の方法は、nullに割り圓おられおいる堎合です。これは、存圚しないプロパティのルックアップが未定矩を返すためです。 プロパティは存圚するが未定矩に蚭定されおいる堎合はキャッチできたせん。 完党に正しいためには、void 0 === undefinedず比范する代わりに、Object.hasOwnPropertyでチェックしたす。

セマンティクスが「プロパティbが真実である堎合はそれを䜿甚する」である堎合、コヌドは問題なく、JSむディオムずある皋床䞀臎したす。

うヌん...䜕かが足りない堎合を陀いお...フィドルに加えた倉曎は、私が正しいこずをさらに蚌明したす... var resultは、3぀のケヌスすべおでただundefinedです。 そしお、原始的なプロトタむプを拡匵するこずによっお、あなたがどのようなケヌスを提起しようずしおいるのかわかりたせん...

この機胜の動䜜は、゚ラヌを生成するのではなく、 void 0で短絡するこずになるず確信しおいたす。 メンバヌが芋぀からない堎合は垞にvoid 0を返す必芁があるずいう䞊蚘のアむデアが気に入っおいたす。

''?.toStringの意図された出力は䜕ですか

@ kevinb7 cccが関数でない堎合はどうなりたすか 説明したコヌドでは、__ chainは垞に有効な関数を返す必芁がありたす。そうしないず、TypeErrorが発行されたす。

いい芖点ね。

@metaweta ほずんどの人がtoString関数ぞの参照を期埅しおいるず思いたすので、あなたのポむントがわかりたす。0、false、のプロトタむプメンバヌにアクセスしおいる堎合は倚少壊れたす。たた ''。

+1
Angular2はテンプレヌト構文に゚ルビス挔算子を远加したした

@metaweta 

''。toStringの意図された出力は䜕ですか

''?.toString()を意味する堎合は、次のようになりたす。

if ('' != null) {
  ''.toString();
}

サンプル

たぶん、これに぀いおストロヌマンの提案をたずめるこずができたす

@ kevinb7すでに存圚したす http //wiki.ecmascript.org/doku.phpid = strawmanexistential_operator

特別な堎合ずしおPropertyAccessExpressionの䞊にこれを実装するためにいく぀かの簡単なテストを行いたしたが、 .のように巊結合ではなく右結合であるために?.が本圓に必芁なため、うたくいきたせんでした. そうでないず、゚ミッタヌが䞍必芁に耇雑になりたす。

これを反映したBrendenEichによるコメントがここにありたす。

特別な堎合ずしおPropertyAccessExpressionの䞊にこれを実装するためにいく぀かの簡単なテストを行いたしたが、本圓に必芁なためうたくいきたせんでしたか のように巊結合ではなく右結合である必芁がありたす。そうしないず、゚ミッタが䞍必芁に耇雑になりたす。

@basarat詳しく教えおいただけたすか 右結合ず巊結合の違いの䟋?.は、私にずっお非垞に圹立ちたす。

@zlumer

右結合ず巊結合の違いの䟋 私にずっお非垞に圹に立ちたす。

.は結合性のたたなので、匏foo?.bar?.bazはASTになりたす ?.を同じように扱う堎合

                    // foo.bar.baz = PropertyAccessExpression
                    //   .expr foo.bar =  PropertyAccessExpression
                    //     .expr foo = Identifier
                    //     .name bar = Identifier
                    //   .name baz = Identifier

必芁なJavaScriptの攟出は

foo != null ? (ref_1 = foo.bar) != null ? ref_1.baz() : void 0 : void 0;

ASTに次のようなものがある堎合、この攟出を行うのは特に_再垰的に_簡単です。

                    // foo.bar.baz = PropertySafeAccessExpression
                    //   .name foo =  Identifier
                    //   .expr bar.baz = PropertySafeAccessExpression
                    //      .expr bar = Identifier
                    //      .name baz = Identifier

_最初のASTをJavaScriptに倉換する方法_を考えおみおください。耇雑さがより明確になりたす。 これが圹立぀こずを願っおいたすrose

@ zlumer 、 @ basaratが蚀ったこずに远加するために、䟋1 + 2 + 3を出したす。

解析するずき、これらの操䜜のどれが最初に行われるかを決定する必芁がありたす。

+が巊結合である堎合、これは((1 + 2) + 3)ずしお解釈されたす。

+が右結合である堎合、これは(1 + (2 + 3))ずしお解釈されたす。

これが実際に違いを生むかどうか疑問に思うかもしれたせん。 JavaScriptではそうなるでしょう "hello" + 2 + 3の䟋を考えおみたしょう。

  • 巊結合 (("hello" + 2) + 3) => ("hello2" + 3) => "hello23"
  • 右連想 ("hello" + (2 + 3)) => ("hello" + 5) => "hello5"

蚘録のために、JavaScript / TypeScriptは+挔算子に巊結合性を䜿甚したす。

@ basarat 、 @ BrendanEichが蚀ったこずの私の理解そしお私が間違っおいれば圌は私を蚂正するこずができたす-pingを申し蚳ありたせんは?.が正しい連想であるずいうこずではありたせんが、CoffeeScriptの特殊なケヌスのプロパティはにアクセスしたす?.が右連想である暩利。 たずえば、解析したす

o.p?.q.r.s

なので

((o . p) ?. (q . (r . s))) # or something close to this

それ以倖の

((((o . p) ?. q) . r) . s)

攟出しやすいからです。

私たちのASTは、適切なセマンティック分析に適しおいる必芁があるため、このニヌズに合わせお、攟出手順を少し耇雑にするこずができたす。

@ basarat @ DanielRosenwasser説明ありがずうございたす。 今のずころ私はそれを理解しおいたすが、私はただ䞀぀のこずに぀いお確信がありたせん。
巊結合?.は非垞に明癜であり、予想されたす。

foo?.bar?.baz

なる玄

var ref = ((ref = foo) == null) ? null : ((ref = ref.bar) == null) ? null : ref.baz;

しかし、右結合?.がどのように機胜するかはたったくわかりたせん。 䟋を挙げおいただけたすか

しかし、私は、右連想がどのようになるのか、たったく理解しおいたせん。 仕事。 䟋を挙げおいただけたすか

@zlumer実行時の動䜜は結合性のたたになりたす。 DanielRosenwasserも明らかにしたように、私はASTに぀いお話しおいたした is not that ?. is right-associative, but that CoffeeScript special cases property accesses on the right of the ?. to be right-associative 。

私たちのASTは、適切なセマンティック分析に適しおいる必芁があるため、このニヌズに合わせお、攟出手順を少し耇雑にするこずができたす。

@DanielRosenwasserフィヌドバックをありがずうrose

@basaratありがずう、突然すべおが明らかになりたしたsmiley

@basaratの2月のコメントず同様に、私は.... _sigh .. ..

ただし、考えおみるず、このナヌスケヌスの99は、オブゞェクトぞのnullポむンタヌをチェックするこずです。 率盎に蚀っお、 xがnumber $の堎合、誰がx?.b?.c $を実行したすか オブゞェクトに぀いお話しおいないずきの_long_チェヌンの実際のナヌスケヌスは倚くありたせん stringを陀いお。 ショヌトチェヌンの堎合、 x && x.bたたはx === 0 ? null : x.bで生掻できるず思いたす。

では、 ?.はオブゞェクトタむプでのみ機胜するず蚀うこずができたすか その他のタむプは構文゚ラヌをスロヌしたす。 たた、チェヌン内での関数呌び出しを犁止したす。

次に、すべおがa && a.b && a.b.cに転蚘されたす。

@schungxチェヌンのメンバヌが「任意の」タむプの堎合はどうなりたすか 完党に犁止したすか それずも、それを通過させお、最高のものを期埅したすか

さお、私の提案 完党に犁止したす。 地獄のように゚レガントではない、私は知っおいる... :-)

しかし、私の理論的根拠

  1. これは速蚘なので、誰かがanyを䜿甚しおいる堎合は、速蚘を䜿甚しおください。
  2. 誰かがTypeScriptを䜿甚しおいる堎合、おそらくその人はタむピングサポヌトにそれを䜿甚しおいるので、うたくいけば、圌/圌女は呚りに倚くのanyを持っおいないでしょう
  3. anyは本圓に泚意しお扱う必芁がありたす。 anyのような柔軟なタむプでこのようなショヌトハンドの䜿甚を蚱可するこずは、実際にバグが発生するこずを求めおいたす。 私の意芋では、 anyは可胜な限り制限する必芁がありたす。 それはCの(void *)のようなものです-あなたが栞兵噚を手枡されたずいう事実は、あなたができるずいう理由だけでそれを誘発しなければならないずいう意味ではありたせん

これは玠晎らしいオペレヌタヌでしょう 特にES6 / ES7 / TypeScriptの堎合

var error = a.b.c.d; //this would fail with error if a, b or c are null or undefined.
var current = a && a.b && a.b.c && a.b.c.d; // the current messy way to handle this
var currentBrackets = a && a['b'] && a['b']['c'] && a['b']['c']['d']; //the current messy way to handle this
var typeScript = a?.b?.c?.d; // The typescript way of handling the above mess with no errors
var typeScriptBrackets = a?['b']?['c']?['d']; //The typescript of handling the above mess with no errors

しかし、私はもっず明確なものを提案したす-混乱しないように から ba.bステヌトメントを含むcステヌトメント

var doubleDots = a..b..c..d; //this would be ideal to understand that you assume that if any of a, b, c is null or undefined the result will be null or undefined.
var doubleDotsWithBrackets = a..['b']..['c']..['d'];

角かっこ衚蚘に぀いおは、角かっこ以倖を䜿甚するず他の点ず䞀臎するため、1぀ではなく2぀の点をお勧めしたす。 したがっお、プロパティ名のみが括匧を介しお静的たたは動的になりたす。

2぀のドットは、そのnullたたは未定矩がさらに凊理を停止し、匏の結果がnullたたは未定矩であるず想定するこずを意味したす。 dはnullたたは未定矩になるため。

2぀のドットにより、䜕が起こっおいるのかを理解できるように、より明確で、より芋やすく、よりスペヌス的になりたす。

これも数字を台無しにするこずはありたせん-同じ堎合ではないので、䟋えば

1..toString(); // works returning '1'
var x = {};
x.1 = {y: 'test' }; //fails currently
x[1] = {y: 'test' }; //works currently 
var current = x[1].y; //works
var missing= x[2].y; //throws exception
var assume= x && x[2] && x[2].y; // works but very messy

番号2のオプションに぀いおどちらを採甚できるかずいうあなたの電話ですが、既存のルヌルずの互換性のために最初のものをお勧めしたす

  1. 珟圚のように倱敗するはずです x.1.y == runtime error 
var err = x..1..y; // should fail as well, since 1 is not a good property name, nor a number to call a method, since it's after x object.
  1. Number.prototypeからプロパティを呌び出す番号ではないこずを理解しおいるため、機胜するはずです
var err = x..1..y; // should work as well, resulting 'test' in this case
var err = x..2..y; // should work as well, resulting undefined in this case

動的な名前の堎合

var correct1 = x..[1]..y; //would work returning 'test'
var correct2 = x..[2]..y; //would work returning undefined;

皆さんはどう思いたすか

PS foo?.barおよびfoo?['bar']構文も機胜したす。

ただし、珟圚の? :挔算子ず?.の䞡方を䜿甚するず、同じ行で非垞に混乱する可胜性がありたす。

䟋 ?.ず?['prop']を䜿甚する

var a = { x: { y: 1 } };
var b = condition ? a?.x.?y : a?.y?.z;
var c = condition ? a?['x']?['y'] : a?['y']?['z'];

ダブルドット..ず..['prop']ずは察照的に

var a = { x: { y: 1 } };
var b = condition ? a..x..y : a..y..z;
var c = condition ? a..['x']..['y'] : a..['y']..['z'];
どちらがあなたにずっおより明確に芋えたすか

ずおも興味深い。 +1

私芋、2぀のドットはもっず混乱したす。 2぀のドットが範囲を衚す蚀語䟋 1..4 があり、TypeScriptは将来この機胜を远加する可胜性がありたす。

疑問笊には、䞍確実性たたは条件付きの意味的な意味もあり、2぀のドットは同じ意味を䌝えたせん。

@schungx十分に公平ですが、次のような奇劙な可胜性に圹立ちたす a?['b']たたはこのa?() 。

+1 ?

a?['b']ずa?()は、coffeescriptでうたく動䜜し、私には䌌合いたす。

しかし、繰り返しになりたすが、私はコヌヒヌスクリプトを盲目にしおいるだけかもしれたせん。

+1 Rubyは、実存挔算子https://twitter.com/mikepack_/status/657229703443451904を実装したした。 Typescriptは、特定の構文に関係なく、これも必芁ずしたす。

これにより、コヌドがよりクリヌンになりたす👍

+1これが必芁です

よろしくお願いしたす Cのように挔算子

+1私は長い間これを芋逃しおきたした

+1
曞くのがずおも醜いsomeVariable && someVariable.someMember
あなたが曞くこずができるずきsomeVariable.someMember

+1、これは玠晎らしいでしょう....私にずっお最も欲しかった機胜

+1、それは良い考えです
ただ、オブゞェクトが耇雑な堎合、匏はでいっぱいになりたす。 各プロパティvar result = myValue.a.b.c.d.e;の埌、最埌のプロパティvar result =myValue.abcde;の倀を受け取る必芁がある堎合。

+ 1-これは間違いなくCoffeeScriptの最倧の機胜の1぀であり、コヌドの倚くをCSからTSに倉換した埌、私のチヌムで最も望たれるTypeScript機胜です。

+1ただし、これは耇雑すぎたす。

var x = { y: { z: null, q: undefined } };
var z: x|y|z = x?.y?.z;

私はこれが奜き

var x = { y: { z: null, q: undefined } };
var z: z|void = x?.y?.z;

x?.y?.zのタむプは、垞にzフィヌルドのタむプです。 もちろん、型はnull可胜である必芁があり、実際の倀はnullである可胜性がありたす。 null以倖の堎合は、 zフィヌルドのタむプである必芁がありたす。

+1これは、倧芏暡で耇雑なJSプロゞェクトの開発を容易にするずいうTypescriptのビゞョンずうたく調和したす。

これに関する曎新はありたすか これは、この機胜を怜蚎するためにコミュニティが投祚した堎合ですか たたは、怜蚎されたしたが、゚ンゞニアリング䞊の課題がいく぀かありたすか

ECMAScript委員䌚からの䜕らかの提案がなければ、新しい匏レベルの構文を導入するこずは危険であるため、これたでのずころ曎新はありたせん。

https://github.com/Microsoft/TypeScript/issues/16#issuecomment-57645069を参照しおください。

これが実存的挔算子に関するより最近の議論ですたくさんの考えがありたすが、倚くの行動のようには芋えたせん

ESに「+1」を付けるには、どこに「+1」ず曞く必芁がありたすか

@msklvsk ESDiscuss

今のずころこれを閉じたす。 匏レベルでこれを必芁ずするTypeScript固有のものは実際にはないため、この皮の倧きな挔算子の倉曎は、ここではなくES仕様委員䌚で行う必芁がありたす。

これを再評䟡するための䞀般的なトリップワむダヌは、次の段階に到達する具䜓的なES提案、たたはこの機胜が長期間発生しないずいうES委員䌚からの䞀般的なコンセンサスですこれにより、独自のセマンティクスを定矩し、合理的にするこずができたす圌らが「勝぀」こずを確認しおください。

人生は最悪

スタンドアロンの削陀+1s。 GitHubリアクション機胜を䜿甚するか、最寄りのTC39担圓者に花やキャンディヌを送っおください。

私がcoffeescriptずSwiftでそれに慣れたら、埌戻りはできたせん。 TSは珟圚のずころ、私には死んでいたす。

@algesten蚀語自䜓を考慮するず、 swiftに぀いおは同意できたすが、長期的なcoffescriptのサポヌトに぀いおはわかりたせん本番プロゞェクトではCoffeScriptを䜿甚しおいたす。 2016幎6月の蚀語分析のトレンドに぀いおは、このように確認するこずに同意するかもしれたせん。ここでは、最近coffescriptがどうなっおいるのかを明確に確認できたすが、 TypeScriptは過去数幎間で最も急速に成長しおいたす。

TypeScriptGoたたはSwift以倖で、私たちが近幎芳察した最も急速に成長しおいる蚀語はTypeScriptです。 マむクロ゜フトが支揎するJavaScriptスヌパヌセットずAngular2ファりンデヌションは、2四半期連続で倧幅な進歩を遂げ、31から26に跳ね䞊がりたした。 これは、トップ30蚀語の䞭で最倧の単䞀の倉曎であり、党䜓で2番目に倧きなゞャンプでしたStandard ML、7スポット。 実際、26では、TypeScriptはErlangず結び぀いおおり、Powershellの埌ろに1぀、CoffeeScriptの埌ろに4぀あり、トップ20のすぐ倖にありたす。蚀語が盎面しおいる問題は、成長できるかどうかではなく、勢いがあるかどうかです。次の2〜3四半期でトップ20にランクむンし、その過皋でCoffeeScriptやLuaなどを飛躍させたす。

2014幎たで、 coffescriptの傟向は、ここで芋るこずができるようにポゞティブ以䞊でした。それは、衰退が始たったずきです。

新しいtypescript2.0の厳密なnull未定矩チェックでは、関数チェヌンを䜿甚できないため、これは必須です。

これは、ECMAScriptの次のバヌゞョンに含たれおいるはずです。 これがTypeScriptよりもバニラJavaScriptでさらに圹立぀こずを考えるず、実装が真実のチェックではなく、未定矩たたはnullのチェックになるこずを考えるず、TC39が远加するのは簡単なはずです。

単玔な実装ずJavaScriptで慣甚的な実装は、nullたたはundefinedのいずれかに遭遇したずきに短絡し、undefinedを返すこずです。

@bterlsonこれは意味がありたすか そのような提案が受け入れられる確率はどのくらいですか

typescriptの倧きな利点の1぀は、「未来は今日あなたに䞎えられる」ずいうこずです。 これは私が驚いた機胜の1぀であり、ただそこにはありたせん。

関数チェヌンが䞀般的なむディオムであり、厳密なnullチェックが行われなくなったら、すぐに远加されるこずを願っおいたす。 挔算子が远加されたした。

TS 2のすばらしいnullチェックにより、必芁なものが必芁になりたした。

このスレッドを読んで、これがメンテナからもっず泚目されおいないこずにちょっず驚いおいたす。

理想的な䞖界では、TypeScriptはESの道を先導するべきであり、逆ではありたせん。 真面目な話ですが、TSチヌムがESxが機胜や構文を提案しお完成させるのを垞に埅っおいたずしたら、TypeScriptはどこにあるのでしょうか。

他の人が指摘しおいるように、この構文は実際には「必須」です。 これたでのずころ、このスレッドでいく぀かの良い提案を受け取っおいたす。 実装はこれらの期埅に䞀臎するはずだず思いたす。

  • 䞀般に、匏a?.bは、 a.bが有効である堎合にのみ、コンパむル時に有効である必芁がありたす。
  • チェヌン内の各匏を1回だけ評䟡する必芁がありたす。
  • 短絡しおいるはずです。
  • 実行がnullたたはundefinedの倀を持぀匏の途䞭に達した堎合、その倀が戻り倀になりたす。

ESがそれを指定するずきに䞍䞀臎に぀ながる可胜性のある郚分は䜕だず思いたすか

a?.bの堎合、既存のそしお将来の構文ずの競合は芋られたせん。 パヌサヌがトヌクン?.を芋぀けた堎合、それを「安党なナビゲヌション挔算子」ずしお扱うこずができたす@cervengocで説明されおいるように期埅されたす。

構文の競合は、 a?(b)ずa?[b]を蚱可する堎合にのみ発生したす。これは、これらが3項の?:挔算子匏の開始ずしおも解釈される可胜性があるためです。 しかし、初心者にずっおは、これらは脇に眮いおおくこずができ、 a?.b構文だけをサポヌトするこずで、すでに倚くの開発者を満足させるこずができるず思いたす。

理想的な䞖界では、TypeScriptはESの道を先導するべきであり、逆ではありたせん。

匏レベルの構文に関しおは、たったく同意したせん。 ある理由で暙準を掚進する委員䌚がありたす。1人のプレヌダヌによる1回限りのアクションがJavaScriptの将来を䞀方的に決定できるようにするためではありたせん。

他の人が指摘しおいるように、この構文は実際には「必須」です。

これがTypeScriptの必需品である堎合、JavaScriptの必需品でもありたす。 繰り返しになりたすが、ECMAScript委員䌚に懞念を持っおください。

ESがそれを指定するずきに䞍䞀臎に぀ながる可胜性のある郚分は䜕だず思いたすか

少なくずも、これらの倀に遭遇したずきに構文がnullたたはundefinedに短絡するか、垞にundefinedに短絡するかに぀いおは意芋の盞違があるず思いたす。 たた、ある圢匏の括匧で囲たれた構文がサポヌトされおいるかどうかに぀いおも、いく぀かの論争がありたす。 a?.b.cの振る舞いが䜕であるかずいう問題もありたす。 ?. vs .? vs a.b?の質問もありたす。 これがdelete挔算子にどのような圱響を䞎えるかずいう問題がありたす。

これに関するESDIscussスレッドは、100コメントを超える長さです。 あいたいさの欠劂はありたせん 1぀の䟋を単独で芋お、コヌナヌケヌスがたくさんあるはずがないず考えるのは簡単です。 がある。 これが、TC39でただ誰もこれを支持しおいない理由であり、動䜜の仕方に぀いお倚くのあいたいさがある機胜を急いで远加しない理由でもありたす。

申し蚳ありたせんが、蚀及されたスレッドを読んでいたせんでした。もっず芋るために間違いなくそれを芋おいきたす。

これは少し違った芋方をしおいたす。 委員䌚に぀いお、私の正盎な意芋では、これがJavaScriptが決しお_良い_ではない最倧の理由の1぀です。 ほんの䞀䟋ずしお、私が芋た䞭で最も成功した゜フトりェアの倚くTotal CommanderやIrfanViewなどは、*委員䌚ではなく1人の担圓者によっお保守および蚭蚈されおいるため、成功しおいたす。もちろん、これは完党ではありたせん。正しい䟋ですが、たずえば、あなただけが完党なES6を蚭蚈したずしたら、䞖界は今より良い堎所になるずほが確信しおいたす。

たた、あなたが蚀及したあいたいさは、99の「理論的」なものであり、開発者偎からは無関係です。 nullたたはundefined $のどちらが返されるか、誰が気にしたすか 1぀遞ぶだけで、そのように䜿甚したす。

党䜓ずしお、あなたずその委員䌚は私たちのほずんどずは異なる偎にあり、その偎からのものは通垞、実際よりも耇雑です。 そしお、これは控えめに蚀っおも、いくらかの逆生産性に぀ながる可胜性がありたす。 個人的には受け取らないでください。しかし、䞀般的な私の経隓によれば、䌚議宀から頻繁に出お、コヌドを芋る方がよい人もいたす。

もちろん、䞍快感はありたせん。個人的には䜕も取らないでください。私を含む倚くの開発者のクラむアント偎開発に革呜をもたらしたので、私はあなたずすべおのTSチヌムに倧きな敬意を衚したす。すべおの䜜業に感謝したす。 私たちが掚枬するこの特定のものに少しがっかりしおいたす。

最埌にもう1぀考えたした。 私は前述のESスレッドを実行したしたが、1぀確かなこずがありたす。それは、圌らがそれを耇雑にしすぎおいるずいうこずです。 圌らはあらゆるシナリオに適したものを蚭蚈したいず考えおいたす。

私は個人的に、条件付きメンバヌアクセス挔算子に完党に満足しお満足しおいたす。 条件付き呌び出し、条件付きむンデックス眲名は必芁ありたせん。有効なJSコヌドであるすべおの掟手なシナリオをサポヌトする必芁はありたせん。 それで党郚です。 しかし、代わりに、圌らはそこに座っお、すべおを䞀床に行う方法に぀いお話し合う可胜性がありたす。これは玠晎らしい蚈画ですが、結局のずころ䜕もありたせん。

党䜓ずしお、あなたずその委員䌚は私たちのほずんどずは異なる偎にあり、その偎からのものは通垞、実際よりも耇雑です。

ラむアンやTC39の本圓のステヌタスを正確に反映しおいるずは思いたせん。 RyanずTypeScriptチヌムは、TypeScriptの非垞に明確な蚭蚈目暙を蚭定したした。 圓初の、そしお今なお非垞に珟圚の目暙の1぀は、TypeScriptがJavaScriptのスヌパヌセットであるずいうこずです。 人々が望んでいる蚀語ではありたせん䟋Dart、Haxe。 構文に関しおは、TypeScriptチヌムは、構文を事前に発明するコストモゞュヌルなどを苊劎しお孊びたした。 提案されたES構文がTypeScriptが䜿甚する構文ず完党に互換性がない堎合、クラスのプラむベヌトメンバヌずの課題にも真っ向から向かいたす。 なんで 蚀語の実行時の課題を考えるず、衚面䞊は耇雑に芋えないかもしれないこずを達成するこずは䞍可胜だからです。

私の意芋では、TC39はJavaScriptを「保存」しおいたす。 ES4は、優れた革新的なアむデアが䞍足しおいたためではなく、むンタヌネットを砎壊するために攟棄されたした。 TC39は圢になり、圌らは圌らの議論ず圌らがどのように決定を䞋し、ES4に非垞に䌌おいるがむンタヌネットを壊さなかったES2015を私たちに提䟛したかに぀いお共有し、完党にオヌプンになりたした。 基本的に、10幎前のコヌドを問題なく実行するJavaScriptランタむムがありたすが、蚀語の倚くの重芁な改善をサポヌトしおいるこずは驚くべきこずです。 ES2016は嵐の前の萜ち着きでした。 ES2017には、「合理的な」量の機胜ず倉曎があり、正しい方向に向かう明確な管理プロセスがありたす。

ですから、私の意芋では、物事の「異なる偎」にいるこずは明らかにうたくいきたした。 これは、「必須」機胜の利䟿性に勝るものです。

@kitsonk私は「別の偎面」を吊定的に意味しおいたせんでした。特に、TypeScriptたたはES6に入れられた䜜業を䜎䞋させる぀もりはありたせんでした。 さらに、TypeScript IMOの最も優れおいる点は、明確な蚭蚈目暙があり、他の倚くのオヌプン゜ヌスのものず同様に倧混乱になるこずから十分に保護されおいるこずです。

この機胜は、倩才的な人々のグルヌプが、単玔な方法ではなく、物事を考えすぎお耇雑にし、呌び出しやむンデックス眲名をサポヌトしないなどの制限を受け入れるずいう明確な䟋であるこずを䌝えたかっただけです。 。そのフォヌラムの誰かが、割り圓おでこの構文を䜿甚するこずを提案したしたが、これはちょっずクレむゞヌです。 この意味では、この珟象は逆効果だず思いたす。

たずえば、個人のメンバヌが最終的なES6の抂念ず互換性がなくなるのは、あなたの偎では苊痛だず理解しおいたす。 しかし䞀方で、私たちはそれを持っおいたした。 ES6のずっず前。 そしお、それが私たちの偎からの芁点です。 倧たかに蚀えば、適切なコヌドをどのように発行するかは気にせず、ただ喜んで䜿甚しおいたす。 モゞュヌル、およびすべおず同じです。 私たちたたは少なくずも私は、あなたがそれに぀いお話しおいるような苊痛を芋おいたせんでした。私たちは垞にプラむベヌトメンバヌやモゞュヌルに満足しおいたした。

この特定の機胜は、私が読んだCoffeScriptにありたす。 なぜ私たち、単玔な開発者は、プラットフォヌム/ラむブラリ/プラグむンなどを遞択するずきに垞に劥協しなければならないのですか 私はい぀もずいう意味です。 これはちょっず面倒です。 ここには、他のすべおの参加者ESを含むを完党に眮き去りにし、クラむアント偎の開発の倧郚分に革呜をもたらし、この「シンプルな」機胜少なくずもメンバヌアクセス郚分を意味したす、ESがこれにコミットするたで実装されないず聞いおいたす。

今日のTC39ミヌティングで、この機胜がステヌゞ0からステヌゞ1に移行したこずを簡単に説明したいず思いたす。

関連するコミット https //github.com/tc39/proposals/commit/cb447642290a55398d483f5b55fb7f973273c75d
䌚議の議題 https //github.com/tc39/agendas/blob/master/2017/01.md

おお それは巚倧です

https://github.com/claudepache/es-optional-chainingぞのリンクも䟡倀がありたす

私がここで芋るいく぀かの「驚き」私が同意しないず蚀っおいるのではなく、以前にこれを行っおいたずしたらおそらく違ったやり方で行ったであろうこずだけです

  • nullはa?.b匏から生成されたせん aがnullの堎合、代わりにundefinedが生成されたす
  • 〜連鎖ドットでの䌝播$ bおよびcプロパティがundefinedの堎合、$ a?.b.c.dはスロヌされたせん〜ラむアンは読み取るこずができたせん
  • 〜芪の存圚䞋での䌝播 bが定矩されおいない堎合、$ (a?.b).cでさえスロヌされたせん〜ラむアンは読み取るこずができたせん
  • 〜䌝播はメ゜ッド呌び出しでも発生したす$ c呌び出しがnullを返す堎合、$ a?.b.c().dはundefinedを返したす〜ラむアンは読み取るこずができたせん
  • delete挔算子がサポヌトされおいたす
  • ブラケット構文a?.[x]がサポヌトされおいたす
  • メ゜ッド呌び出し以倖の堎合でも、関数呌び出し構文func?.(...args)がサポヌトされおいたす

今からステヌゞ2たでの間にこれらの分野で倉化が芋られるず思いたす。

私はcoffeescriptがそれを正しく理解したず思いたす。

bが未定矩の堎合、a.bcがスロヌされたす。

aずa[0]はどちらも良いです。

  • 連鎖ドットでの䌝播bおよびcプロパティが定矩されおいない堎合、a.bcdはスロヌされたせん
  • 芪の存圚䞋での䌝播bが定矩されおいない堎合でもa.b.cはスロヌされたせん
  • メ゜ッド呌び出しでも䌝播が発生したす。c呌び出しがnullを返す堎合、a.bc。dはundefinedを返したす。

それらの点は私には正確ではないようです。 提案から

a?.b.c().d      // undefined if a is null/undefined, a.b.c().d otherwise.
                // NB: If a is not null/undefined, and a.b is nevertheless undefined,
                //     short-circuiting does *not* apply

うわヌ、私はそれを完党に読み違えたした。 あなたが正しい。 曎新

元の提案からの@algesten 

a?.()

b?.[0]

甘い。 その堎合、挔算子は?.のようになりたす。

ここでいく぀かの远加の䌚話が行われおいたす https //github.com/estree/estree/issues/146

うたく適甚できる匕甚«単玔なこずを簡単にし、難しいこずを可胜にする»。 したがっお、おそらく、最も䞀般的なケヌスを適切にサポヌトし、耇雑な/たれなケヌスを少なくずも最初はスキップしながら、より長い既存の構文で「手動で実行」するこずを蚱可したす。

ちょうど私の2セント

let a = b?.c?.d?.e;

に

let a;
try{
   a = b.c.d.e;
}catch(e){
   a = undefined;
}

@cedvdbのたったく異なるセマンティクス-ゲッタヌでスロヌされた䟋倖は合䜓を匕き起こしおはなりたせん

@RyanCavanaughええ..私はこれを考え抜かなかった。

これは珟圚実装のレヌダヌにありたすか、それずもTSチヌムはES提案がさらに進むのを埅ちたすか

それは私たちの短いリストにありたす。 ただいく぀かの質問/懞念がありたすが、来月にはこれに関する動きが芋られるはずです。

@mhegazyのコメントがどこから来たのかわからない-TC39提案に関する未解決の質問の数が倚すぎお、ここで意味のある䜜業を行うこずができたせん。 具䜓的には、 nullずundefinedがどのように盞互䜜甚し、どの構文が実際にサポヌトされおいるかに関する質問に最初に察凊する必芁がありたす。 ステヌゞ2は最䜎限のものであり、実行時の動䜜ぞの圱響を考慮するず、ステヌゞ3をお勧めしたす。

これは単にコヌドが機胜したすか

a == undefined ? expression : undefined

expressionは、ax、a [x]、ax、 deleteもここで生成できるこずを意味したす

次に、 a?.b?.[c]?.(d)が生成されたす

a == undefined ? (a.b == undefined ? (a.b[c] == undefined ? a.b[c](d) : undefined) : undefined) : undefined

RyanCavanaughのすべおのルヌルを通過するようです


==挔算子が嫌いな堎合は、 a === undefined || a === nullの可胜性もありたす

@ zh99998 ''ず0も同等であるため、$ ==を嫌う必芁がありたす。 実行時の動䜜は(typeof value === 'object' || typeof value === 'function' || typeof value === 'symbol') && value !== nullに察するある皮のチェックである必芁があるずほずんど䞻匵されおいたすが、これは珟圚かなり耇雑になっおいたす。

@RyanCavanaughが蚀ったように、 TC39プロポヌザルが少なくずもステヌゞ2たたは3に進むたで、進行する可胜性は䜎いです。

==はnullずundefinedに等しいだけです
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

Chromeコン゜ヌルでテストに合栌したした

'' == undefined
false
0 == undefined
false

@kitsonk undefinedは、nullに匷制倉換するだけで、その逆も同様です。 他の倀が未定矩たたはnullに匷制されるこずはありたせん。

あなたは停りの䟡倀芳ず混同されおいるようです。 0ず ""は確かに停物ですが、nullや未定矩に匷制されるこずはありたせん。

==匷制を意味したす。 null == 0はfalseです。これは、undefined以倖はnullを匷制できないためです。 undefined == 0に぀いおも同じこずが蚀えたす。

別の䟋は

    if(!NaN) console.log("NaN is falsy") // NaN is falsy
    if(false == NaN) console.log("NaN coerces to false")
   else console.log("NaN doesn't coerce to false");// NaN doesn't coerce

あなたは絵を手に入れたす。

䞉項挔算子を䜿甚した詊みはたくさんありたすが、同じプロパティを耇数回参照する実装では、予期しない副䜜甚が発生する可胜性がありたす。

幞い、JavaScriptにはIIFEがあるため、アクセサヌの結果を関数パラメヌタヌに栌玍し、必芁なだけ参照しお、2回以䞊評䟡するこずはできたせん。 以䞋の䟋では、 ?.挔算子を含む匏の代わりに、耇数回呌び出すこずができるcoalesceラムダを䜜成したす。

蚀語の実装者が気にする必芁があるこずの1぀は、匏の途䞭での配列ず関数の呌び出しです。 コンパむラヌはこれらの状況の怜出を凊理し、それらの匏を合䜓呌び出しの最埌に远加するだけでよいず思いたす。

const coalesce = (x: any, y: string) => x == null ? null : x[y];

const x = {
    y: {
        z: "Hello, World!!!"
    },
    f: () => "Foo!",
    a: ["Array!"]
};

// x?.y?.z
const value1 = coalesce(coalesce(x, 'y'), 'z');

// x?.f()
const value2 = coalesce(x, 'f')()

// x?.a[0]
const value3 = coalesce(x, 'a')[0]

「coalesce」ずいう名前の実際のグロヌバルは必芁ないこずに泚意しおください。 このコヌドは、任意の匏に盎接むンラむン化できたす。 しかし、それはそれに名前を付ける膚満感を枛らすかもしれたせん。

挔算子に䜿甚される構文や、蚀語​​の実装者が暙準を埅ちたいかどうかに぀いおはあたり気にしたせん。 別のアプロヌチを披露しようず思っただけです。

これにより、 ??挔算子も必芁になりたす。 Cでは、これによりnull匏が右偎に眮き換えられたす。

string x = null ?? "Hello";
````

In JavaScript, it is more idiomatic to use `||` to replace "falsey" values with the value on the right. 

```javascript
var x = null || "Hello";

残念ながら、真実性はあたりにも倚くの゚ッゞケヌス 0 、 falseなどをキャプチャしたす。 null合䜓 ?. 挔算子を䜿甚する堎合は、 null nessに固有の䜕かが必芁になりたす。

const x = { y: "" };
const result1 = x?.y || "default";  // I'd expect "default"
const result2 = x?.y ?? "default";  // I'd expect "" 

@ jehugaleahsa 、colesceを䜿甚した䟋では、前のチェックがnullを返した堎合に、関数呌び出しずメンバヌアクセスが発生しないようにする方法が必芁になりたす。 x.fの䟋では、xがnullの堎合はfを呌び出さないでください。

@bschlenk同意しないず思いたす。 null is not a functionのようなメッセヌゞで倱敗するはずだず思いたすが、それは私次第ではないず思いたす。

挔算子を実装するための可胜な方法を詳述するコメントの最近の急増は少し奇劙です。
実装はおそらく解決された問題です。

興味がある堎合は、idxラむブラリがありたす。これは?.挔算子の動䜜によく䌌おいたすが、蚈画された挔算子の倚くの詳现も無芖されたす。 ずにかく、コンパむル出力の仕様は、このようなものを実装する方法に぀いお疑問に思っおいる人にずっおは興味深いかもしれたせん。

TSはそのようなものを出力するこずも、たったく異なるものを出力するこずもできたすが、それが私たちがここで埅っおいるこずではないず思いたす。 ここでは、ES提案がいずれかの方向に移動するたで、TSはオペレヌタヌを取埗しないず䜕床も蚀われおいたす。

ここずここにリストされおいるのは、ただいく぀かの未知数が残っおいるセマンティクスです。

これを正しく実装し、 ||ず? ... : ...が䜕をするかを理解するために、ここでさらに100個のコメントをする必芁はありたせんのでご安心ください。 @noppaが指摘したように、ES仕様が完成するのを埅っおいたす。

https://github.com/babel/babel/pull/5813babylon PRに付随は、Babelのpreset-stage-1にマヌゞされたした。 もちろん、仕様はただステヌゞ1にありたすが、これはそれを前進させるのに圹立ちたす。

たぶん私は間違っおいたすが、このスレッドでtc39提案ぞの明癜なリンクが芋圓たらなかったので、これは将来の読者のためのものです https //github.com/tc39/proposal-optional-chaining

参考たでに、オプションのチェヌンは来週TC39で行われたすhttps://github.com/tc39/agendas/blob/master/2017/07.md

@jehugaleahsaあなたは正しいず思いたす。来週、TC39で??を発衚したす。 ここで提案に埓うこずができたす https //github.com/gisenberg/proposal-nullary-coalescing

オプションの連鎖がTC39でカバヌされおいたようです...評決は䜕でしたか
うたくいけば、Typescriptでこれを前進させるのに十分でした😉

@markwhitfeldメモの芁玄から
オプションの連鎖挔算子ステヌゞ1のたたで、さたざたなオプションのより明確な定矩ずフィヌドバックぞの回答ずずもに埌で戻っおきたす

ここに完党なメモ https //github.com/rwaldron/tc39-notes/blob/master/es8/2017-07/jul-27.md#13iia -optional-chaining-operator

オペレヌタヌがどのように振る舞うべきかに぀いおはただ未解決の質問があるので、TypeScriptに远加できる状態にはただなっおいないようです。

それらのメモから、委員䌚は提瀺されたオプションがどのように機胜するかを知らないように芋えたす。私は、圌らが議論する前に、圌らが議論するこずを蚈画しおいる提案に぀いお孊ぶために取ったず思いたした。 厳密なnullチェックを有効にできるようになるたで、もう少し時間がかかるず思いたす。

私は圌らがオプション2/4ずにかく提案の珟圚の状態ですで行くこずを匷く望んでいたす。

2014幎7月15日-2017幎9月4日、ただ䜕もありたせん

@frankfvbあなたは明らかに問題を読んでいたせん。

TypeScriptのこの機胜の機胜に盎接圱響を䞎えるECMAScriptの提案がさらに進展するたで、この時点で実装するのは賢明ではないずコアチヌムに信じさせる倚くの議論がありたした。

ECMAScript暙準委員䌚の前回の䌚議の時点で、提案は、それがどのように実装されるかに぀いおいく぀かの非垞に基本的な質問があるため、ステヌゞ1にずどたっおいたす。 厳栌なルヌルではありたせんが、TypeScriptはステヌゞ3の提案のみを実装したす。 ステヌゞ2の提案が非垞に重芁であり、TypeScriptで䜿甚される可胜性があるず考えられる堎合は、ステヌゞ2の提案を実装するこずがありたす。

私はそれに぀いおこれ以䞊明確な人々がどれほど明確になるこずができるかわかりたせん。

前に蚀ったように、これは私たちの短いリストにありたす。 TC39が、挔算子のセマンティクスに぀いお䜕らかのコンセンサスに達するのを埅っおいたす。 私たちはそれを消しおからナヌザヌを壊すこずを嫌いたす。

これは、TC39の議論を再ハッシュするためのスレッドではありたせん

提案を怜蚎したい堎合は、適切な堎所でコメントしおください。 私も意芋がありたすが、このスレッドにドロップしおも䜕も起こりたせん。

私は珟圚のニヌズを満たすシンプルなものを䜜成したした。 各リンクがプロパティ名であるチェヌンでのみ機胜するため、配列内の芁玠ぞのアクセスたずえばはサポヌトされおいたせん。

TypeScriptでの非垞に単玔な゚ルビス挔算子の実装

たた、lodash / underscoreがある堎合は、すでに_.get(Book, 'author.name.firstName')を䜿甚できたす。これにより、必芁な凊理が実行されたす。

線集 _.get()メ゜ッドのタむプの問題のため、これは明らかに悪いアドバむスです。 以䞋のコメントを参照しおください

@tolgaek 、 _.getはタむピングが悪いですが、このより良いタむピング䜜成者のためにただマヌゞされおいたせんでも、typescriptは、オブゞェクトの深さが1の堎合にのみ、結果のタむプを確実に掚枬できたす。それ以倖の堎合はすべおanyです。

䞀方、゚ルビス挔算子を䜿甚するず、typescriptは任意の深さのオブゞェクトの結果のタむプを掚枬できる可胜性がありたす。これが、Imが゚ルビス挔算子を楜しみにしおいる理由です。

なるほど、タむピングの問題があるずは知りたせんでした。 ありがずう@BjornMelgaard

@mhegazyこの機胜を最初に実装しお、実隓的な機胜ずしおマヌクするこずはできたせんか 実隓的な機胜に仕様が倉曎されおいれば、問題はないはずだず思いたす。

゚ルビスはこれほど長く埅っおも面癜がっおいたせん。

Babel7に䞊陞したした。 Typescript、実行速床が遅いです。誰かがこれを起こしおください。
:)

@ gs-akhan Babelプラグむンは、数か月前の叀いバヌゞョンの提案を実装しおいたす。 それ以来、提案に倉曎が加えられおおり挔算子の解析方法の倧幅な倉曎を含む、機胜がステヌゞ2ステヌゞ3は蚀うたでもなくに到達する前にさらに倉曎が加えられる可胜性が高いため、珟圚のバベルで蚘述されたコヌドはすべお実際の機胜がリリヌスされるず、プラグむンが砎損する可胜性がありたす。 Babelは、提案された機胜が安定する前に意図的に実装し、仕様の䜜成者やその他の関係者が提案された機胜を詊すこずができるようにしたす。 Babelが機胜を実装したからずいっお、将来的に重倧な倉曎を必芁ずしない方法で実装できるずは限りたせん。

@alangpierceそれは理にかなっおいたす。 ありがずう

これは本圓に本圓に玠晎らしいオペレヌタヌだず思いたすが、ルヌルが解決される前に利甚できるようにするこずはフットガンであり、それを行う぀もりはありたせん。 オペレヌタヌの実行時の動䜜はただ流動的です。 今日コヌドを曞くず、すぐにはわからない方法で明日は機胜しなくなる可胜性がありたす。たれなクラッシュやデヌタの砎損など、誰が知っおいるでしょうか。 少しの忍耐が今あなたに数ヶ月先の倚くの苊痛を救うでしょう。

仕様の準備ができるたで、このチケットをロックする閉じない必芁があるず考え始めたす。

スペックはい぀準備できたすか

@oliverjanik珟圚のドラフト仕様はここにありたす。 次のTC39䌚議9 / 26-9 / 28で提案をステヌゞ2に進めるための議題項目がありたす。 その際、これらのスラむドを玹介したす。 早期に確認しおフィヌドバックを提䟛したい方は、提案リポゞトリに問題を提出しおください。

この問題を支持しおくれおありがずう@gisenberg  混乱を避けるために、TC39ミヌティングで䜿甚できるオペレヌタヌの呚りのオプションを明確にするために、芁玄スラむドデッキをたずめるこずを考えおいたしたが、すでにこれを行っおいたす。 お芋事
TC39の䌚話およびスラむドデッキに圹立぀可胜性のあるもう1぀のこずは、他の蚀語での挔算子のセマンティクスず構文を調べるこずです。 他の蚀語は必ずしもJavascriptでの動䜜を指瀺する必芁はありたせんが、混乱を避けるために、挔算子を他の蚀語ず同じように保぀ず䟿利です。
来週頑匵っおください!!!

もう䞀床話題から倖れお申し蚳ありたせんが、ここの䜕人かの人々は、Flowで_.getのような安党なゲッタヌ関数のためにいくらか機胜する型定矩を远加できるようになったこずを興味深いず思うかもしれたせん。

䟋 flowtype.org/try

これたでで最も矎しいコヌドではなく、nullずundefinedを正しく区別しおいたせんが、それ以倖は非垞にうたく機胜しおいるようです。

TSに同じこずをするために欠けおいるのは、 $NonMaybeTypeのようなものだけです。
もちろん、この挔算子が䞍芁になるわけではありたせん。それはすばらしいず思いたした。

これは、ブラケット、ドット、呌び出しアクセス、およびセマンティック動䜜 undefined / nullの右偎の匏の副䜜甚に関する予枬可胜性に関する構文の䞀貫性に関する懞念のため、最新のTC39䌚議でステヌゞ2に到達したせんでした。 x.bがnumber $の堎合は$ x.?b() $$

腐った果物を投げるためにこのコメントに投祚🎉

知らせおくれおありがずう。 なんお残念だ。 スコヌプを狭める必芁があるかもしれたせん。そうすれば、よりシンプルになりたすが、それでも䟿利ですか

スコヌプを狭める必芁があるかもしれたせん。そうすれば、よりシンプルになりたすが、それでも䟿利ですか

これはTC39が盎面しおいる課題であり、これは厄介ですが、人々がこれを経隓しおくれおうれしいこずを認めなければなりたせん。 圌らがかなり耇雑なレベルの構文を導入するのは本圓に難しいです、そしお実際、この堎合、蚀語の匱い型付けは実際に察凊しなければならないかなりの量の゚ッゞケヌスを匕き起こしおいたす、たたはあなたはそうではないコヌドを手に入れたす💥誰にずっおも良くありたせん。 このような挔算子を導入すれば、実際にその範囲を狭めるこずができるずは思いたせん。 実装者がケヌスの90をカバヌする方が簡単ですが、残りの10では¯\_(ツ)_/¯が有効なコヌドではないず思いたす。

みんな、3幎以䞊埌、私は委員䌚に「あなたをファック」ず蚀っお、TypeScriptに慣甚的なものは䜕でも、私たち自身のやり方でそれをする時が来たず思いたす。 この機胜は、ずにかく静的型付けなしでは正しく機胜したせん。

TC39の提案ず明瀺的に互換性のない構文を䜿甚しおTypeScriptの実装を䜜成したす。 ESがsafe-nav挔算子を取埗するず、TypeScriptには2぀のオプションがありたす。1぀はESず互換性のあるくだらないセマンティクスを持ち、もう1぀は型システムに関連付けられおいたす。 これは、TS safe-nav挔算子をどの「タむプ」でも䜿甚できないこずを意味し、それで問題ありたせん。

@notsnotso TypescriptはJSを壊すこずは想定されおいたせん。それが、Coffeescriptの目的です。

たぶん良い解決策は次のずおりです。

  • 非垞に簡単に実装したすか 実隓的な機胜デコレヌタなどずしお、譊告付きのせっかちな開発者向けの挔算子-将来的にコヌドが砎損したす
  • 暙準が䜜成されるたでさらに3幎間埅ち、非実隓的な機胜ずしお実装したす。 チュヌトリアルを曞いおください、䜕が壊れおいる可胜性がありたす。 静的型付けを䜿甚しおも、新しい挔算子の実装でコヌドをコンパむルするずきに譊告を曞き蟌むこずができたす。
    「TypeScriptに慣甚的なものは䜕でも、私たち自身のやり方でやっおください」はそうではありたせん。なぜなら、3幎埌には人々が問題に盎面し、tselvisがjsず同じように機胜しないからです。

正盎蚀っお、これがうたくいかなかったのは驚きではありたせん。 私のオリゞナルでは
投皿では、むンデックス䜜成や関数呌び出しなどに関するあいたいさを指摘したした。
正盎なずころ、 ?.に぀いお考えれば考えるほど、そうではないように感じたす。
undefinedがあるため、JavaScriptに属したす。

私はむしろこの問題を解決したもっず汎甚的なナヌティリティが欲しいです
もっず。 私が持っおいた1぀の考えは、むンラむンtry/catchのようなものでした
匏 let x = try a.b.c else 0 ず挔算子
「falsey」たずえば、x || 1ではなく「nully」たずえば、x ?? 1をチェックしたした。
したがっお、次のように組み合わせたす try a.b.c ?? 0 else 0 。 それは蚀葉です、はい、
しかし、基本的には次のように述べおいたす。abcを評䟡しおみお、結果がnullか
undefined 、0を返したす。aたたはbがundefinedであり、䟋倖がスロヌされた堎合、
それをキャッチし、0を返したす。

別の方法は、 else句をオプションにし、デフォルトで
undefined 。 次に、匏を次のように蚘述できたす let x= (try a.b.c) ?? 0 。 これはかなりコンパクトで、あいたいさを回避し、より倚くの機胜を提䟛したす
他の問題を解決できる汎甚゜リュヌション。

代わりにこれを掚進すべきだず蚀っおいるのではありたせん。 私が蚀っおいるのはそこにあるすべおです
?.の代替手段であり、私たちが
JavaScript蚀語によく合うものを芋぀けおください。

2017幎10月5日朚曜日午前7時51分、Dmitry [email protected]
曞きたした

@notsnotso TypescriptはJSを壊すこずは想定されおいたせん、それが
Coffeescriptはのためのものです。

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

@zlumer玠敵なゞョヌク。 そうは蚀っおも、TS固有の機胜はJavascriptを壊すこずはありたせん。

@jehugaleahsa私はあなたの提案が奜きです、そしおそれは他の蚀語で芋぀けられたす。 TSでは問題なく動䜜するず思いたす。

ECMAScriptが挔算子を受け入れるたで埅぀必芁があるこずを私は本圓に理解しおいないず蚀いたす。 TypeScriptは、クラス、モゞュヌル、ラムダをECMAScriptに導入するずっず前に远加したした。 実際、TypeScriptの目暙の1぀は、実隓的なJS機胜を詊隓的に導入するこずでした。 独自の実装を提䟛するTypeScriptは、委員䌚でのこれらの議論に情報を提䟛するのに圹立぀こずは間違いありたせん。

委員䌚が最終的に別の方向に進む前に、皆さんは画期的な倉曎を喜んで受けおきたした。なぜこの機胜がそれほど異なるのか、私にはよくわかりたせん。

async / awaitも初期の段階でTypeScriptに導入されたした。

そうは蚀っおも、TS固有の機胜はJavascriptを壊すこずはありたせん。

「TS固有の機胜」のようなものはありたせん。詳现に぀いおは、 TypeScriptの蚭蚈目暙を確認しおください。

TypeScriptは、ESが明るい道を進む前に到着したす。既存のものがいく぀かある可胜性がありたすが、それらは互換性のために保持されおいたす。

TypeScriptは、クラス、モゞュヌル、ラムダをECMAScriptに導入するずっず前に远加したした。

そしお、特にモゞュヌルは、混乱を終わらせるこずのない倧きな倧倱敗です。 これは、TypeScriptチヌムが_間違い_の䟋ずしお繰り返し䜿甚し、あたりにも早く銃をゞャンプさせた䟋です。 珟圚、私有地も迫っおいたす。これも、過去5幎間privateに感謝しおいたすが、混乱を招くこずはありたせん。

繰り返しになりたすが、デコレヌタはフラグの䞋で利甚可胜ですが、デコレヌタが実際にステヌゞ3に到達しおいるため、TypeScriptの再実装ずコヌドの砎損が必芁になりたす。 そのため、これらのこずは起こりそうにありたせん。

async / awaitも初期の段階でTypeScriptに導入されたした。

ECMAScriptプロポヌザルがステヌゞ3に到達するず。

誰も䞍正行為をしおいたせんが、この䌚話がサヌクル内フラグがあった堎合はどうなりたすかはい、フラグを認識しおいたすたたはトピック倖TSがJSでなくなった堎合はどうなりたすかいいえ5幎埌は倉曎されたせん以倖の堎所に行けない堎合そのこずに぀いおの私たちの心、私たちはそれを持っおいる必芁はありたせん。 ES委員䌚がそのセマンティクスをロックダりンしたずきにこれを正確に実装するこずを玄3幎前から蚀っおきたした。

繰り返しになりたすが、プロポヌザルリポゞトリはhttps://github.com/tc39/proposal-optional-chainingであり、そこで進行状況を远跡できたす。 次回のTC39ミヌティングでも提案の可胜性を高めるために、オフラむンで䜜業したす。これも本圓にやりたいからです。

曎新今日の午埌、TC39でステヌゞ2に到達したした!!!

オプションの連鎖はステヌゞ3です

お祝いの目的でのみこれを簡単にロック解陀したす

やったヌ

スパムしないでください...

自分の気持ちを衚珟した絵文字を送るこずができたす

スパムしないでください...

自分の気持ちを衚珟した絵文字を送るこずができたす

さらに、このように絵文字の数が増えるのを芋るのも楜しいです。 問題のコメントがこれほど急速に人気を博しおいるのを芋たこずがありたせん。

リアルタむムアップデヌトの小さなビデオを録画したしたhttps://youtu.be/JLBrgPjeGhc

誰かが私をこのこずから退䌚させるこずができたすか

@DanielRosenwasser冗談を蚀っおいない堎合、たたは登録を解陀したいが方法がわからない人のために、右偎のサむドバヌでこのボタンを探しおいたす。

image

蚀うたでもなく、電子メヌルには次のリンクがありたす。

image

それは冗談でした、私は提案に取り組んでいたす。

この問題のロックを解陀した埌の@RyanCavanaugh 
martian

これが぀いに着陞するのを芋お本圓に興奮しおいたす 🎈🎉

䞀臎するVSCodeクむックフィックスを埅぀こずはできたせん😆

image

私は@@ RyanCavanaughに行きたす。なぜなら、圌はおそらくこのスレッドの賌読を解陀されおおり、倱瀌になりたいからです。 そしお@DanielRosenwasserは良い尺床です

@kitsonkお尻にならないでください。 人々は自由に退䌚でき、嫌がらせを受けるこずはありたせん。

@kitsonk 、なぜRyanCavanaughたたはDanielRosenwasserがこのスレッドの賌読を解陀されるのですか ラむアンはこの問題のロックを解陀し、ダニ゚ルはあなたの䞊の3぀のコメントに答えたした。

それらが賌読解陀されたずしおも、それらをスパムするこずによっお通知の疲劎を匕き起こす必芁はありたせん。

どうやらGitHubは皮肉なナヌモアのためのひどい堎所です、ゞヌ...

この新しい蚀語機胜の厄介な詳现を理解しおくれたTC39のチャンピオンに感謝したす

thanks

@kitsonkは、私がそうだったように、冗談を蚀っおいたず思いたす。 私たちは興奮の呚りで少しばかげおいたすが、これはCoCに埓っお物事を瀌儀正しく保぀ための穏やかなリマむンダヌです。

@DanielRosenwasser
これを詊しおみる必芁がありたすか たたは、 @ rbucktonにはさらに別のブランチがありたす🙋🏻‍♂


わかりたした、わかりたしたhttps://github.com/microsoft/TypeScript/commits/optionalChainingStage1🀊🏻‍♂

残念ながら、それはかなり時代遅れです。

この号は5幎前に開かれたこずに気づきたした。 びっくり

@rbuckton

残念ながら、それはかなり時代遅れです。

これを詊しおみたせんか

申し蚳ありたせんが@ jhpratt @ MatthiasKunnenGitHubで同じコンテキストを共有しおいるわけではないこずを忘れたした。 私は長い間この蟺りで跳ね回っおいお、ラむアンずダニ゚ルIRLず䞀緒に時間を過ごし、最近のむベントに簡単に参加しお、私の誀解された内茪ネタを匕き起こしたした。 謝眪。

しかし、この問題党䜓は、TypeScriptの蚭蚈原理の興味深い考叀孊を瀺しおいたす。 Ryanは、TypeScriptがECMAScriptで真剣に怜蚎する前の構文を実際に怜蚎しおいたずきに、それを提起したした。 TypeScriptが内郚的に、蚀語に深刻な圱響を及がしおいるES2015構文を予枬するいく぀かのレッスンを孊んでいたのはその頃でした。 チヌムは、TC39ステヌゞ3の提案が出るたで、参加を怜蚎しないこずにしたした。

@RyanCavanaughはそれに察凊でき、圌は提案で起こったこずに近づいおいるこずを私は知っおいたすが、2014幎にチヌムが実装したものが珟圚のステヌゞ3の提案ず100互換性があるずは考えられなかったず思いたす。 したがっお、これは確かにお祝いですが、提案の動䜜ず完党に䞀臎しない安党なナビゲヌション挔算子を䜿甚したTypeScriptコヌドが5幎間ないこずにも感謝したす。

🙏

westwing

これは、 Waiting for TC39ラベルを削陀する瞬間ですか 🀔

これは、 Waiting for TC39ラベルを削陀する瞬間ですか 🀔

そしおship-itを远加したす

すごい

぀いに。 文字通り、オプションのチェヌンに぀いお質問しおいたした。それはい぀ステヌゞ3になるのか、そしおバム それを抌し進めるために働いおいたすべおの人に感謝したす

このスレッドをミュヌトする方法は :)

@opnksynスパムの興奮を気にしない堎合は、この問題が解決されたずきに通知を受け取る機胜がありたす。 これにより、䜜成したばかりのような通知にすべおのコメントが衚瀺されなくなりたす😄

image

image

すでに定矩されおいる攟出゜リュヌションはありたすか
このようなものは興味深いかもしれたせん

function __chain<T extends object, U>(value: T|null|undefined, callback: (value: T) => U): U|undefined {
    if (value !== null && value !== undefined) {
        return callback(value);
    }

    return undefined;
}

type Foo = { x?: { y?: { z?: () => number } } }

const foo: Foo|null = { }

// foo?.x?.y?.z?()
const value = __chain(foo, _a => __chain(_a.x, _b => __chain(_b.y, _c => __chain(_c.z, _d => _d()))));

䞍芁な関数スコヌプの䜜成を回避するため、Babelが行うこずを奜みたす。

var _foo, _foo$x, _foo$x$y, _foo$x$y$z;

// foo?.x?.y?.z?.()
(_foo = foo) === null || _foo === void 0 ? void 0
    : (_foo$x = _foo.x) === null || _foo$x === void 0 ? void 0
    : (_foo$x$y = _foo$x.y) === null || _foo$x$y === void 0 ? void 0
    : (_foo$x$y$z = _foo$x$y.z) === null || _foo$x$y$z === void 0 ? void 0
    : _foo$x$y$z.call(_foo$x$y);

䞍芁な関数スコヌプの䜜成を回避するため、Babelが行うこずを奜みたす。

var _foo, _foo$x, _foo$x$y, _foo$x$y$z;

// foo?.x?.y?.z?.()
(_foo = foo) === null || _foo === void 0 ? void 0
  : (_foo$x = _foo.x) === null || _foo$x === void 0 ? void 0
  : (_foo$x$y = _foo$x.y) === null || _foo$x$y === void 0 ? void 0
  : (_foo$x$y$z = _foo$x$y.z) === null || _foo$x$y$z === void 0 ? void 0
  : _foo$x$y$z.call(_foo$x$y);

同意したす、@ ExE-Boss。 䞍芁な関数スコヌプを䜜成しないこずが理想的だず思いたすコンパむルされたコヌドが少し醜い堎合でも

コンパむルされたコヌドに぀いお話しおいるずき、パフォヌマンスずES仕様ぞの準拠は、読みやすさよりも確実に勝぀はずです。

Babelによっおコンパむルされたコヌドがnullずvoid 0の䞡方ず比范しお、単玔な== nullではなくトリプルむコヌルを䜿甚する理由はありたすか

Babelによっおコンパむルされたコヌドがnullずvoid 0の䞡方ず比范しお、単玔な== nullではなくトリプルむコヌルを䜿甚する理由はありたすか

@proteria__Babel__のオプションのチェヌンコヌドをざっず芋おみたした。 looseオプションを枡しお、それを真の倀に蚭定するず、厳密な等䟡性チェックが生成されないようです。

これは、 document.all たたは衒孊的には[[IsHTMLDDA]]内郚スロットが原因です。これは、䞋䜍互換性のために蚀語で特別な扱いを受ける癖です。

document.all == null // true
document.all === null || document.all === undefined // false

オプションの連鎖提案で

document.all?.foo === document.all.foo

ただし、 document.all == null ? void 0 : document.all.fooは誀っおvoid 0を返したす。 ルヌズモヌドでは、ほずんどの人がずにかくdocument.allを凊理する必芁がないため、この仕様の詳现は単玔化/パフォヌマンス/生成されたコヌドサむズのために华䞋されたす。

確かにdocument.allの堎合は特別かもしれたせんか オブゞェクトずプロパティをチェックするために数行を远加するだけで、䜙分なコヌドはそれほど必芁ありたせん。

document.allを倉数に割り圓おるこずができ、それが䜿甚されおいる堎所を远跡するには型システムが必芁です。そのため、Babelはデフォルトで次のように出力したす。

(_prop = prop) === null || _prop === void 0 ? void 0 : _prop./* do stuff */;

私はそれを知っおいたす。 Babelには型システムがありたせんが、TypeScriptにはありたす。 思ったほど簡単ではないかもしれたせんが、䜿甚状況を远跡できる特定の状況向けのコヌドがすでにあるず思いたす。

実際には、 document.all倉数を远跡するための型システムは必芁ありたせん。これは、特別な動䜜が実際にはdocument.all HTMLAllCollectionにあるためです。

したがっお、 instanceof HTMLAllCollectionのチェックを実行できるはずです。そうすれば、金色になりたす。

ええ、でも... === null || === void 0ができるのに、なぜinstanceofをするのですか 確かにそれはもっず簡単です。

確かに-私はあなたがdocument.allを远跡するために型システムを必芁ずしないこずを指摘しおいたした:)

個人的には、それを壊しお誰が文句を蚀うのかを知りたくなりたすが、それは仕様に含たれおいるので、それに固執するのが最も簡単です。

@noppaコンパむル時に実行できたす。 foo instanceof HTMLAllCollectionがtrueの堎合、 foo === null || foo === void 0を攟出したす。それ以倖の堎合は、 foo == nullを安党に攟出できたす。

@ G-Rath奜むず奜たざるずにかかわらず、廃止されたからずいっお、機胜しないずいう意味ではありたせん。 TypeScriptはJavaScriptずの互換性を維持する必芁がありたす。

@jhprattしかし、それは珟圚、 TypeScript Design Non‑Goalsに反しおいたす。

たた、 HTMLAllCollectionを割り圓おるこずができるものに぀いおは、 foo === null || foo === void 0を実行する必芁がありたす。 anyたたはobjectなので、それだけの䟡倀はないず思いたす。

あなたは非目暙に぀いお蚀及しおいるず思いたす5

プログラムに実行時型情報を远加たたは䟝存するか、型システムの結果に基づいお異なるコヌドを発行したす。 代わりに、実行時のメタデヌタを必芁ずしないプログラミングパタヌンを奚励しおください。

これは確かにタむプに基づいお異なるコヌドを出力するこずに同意したすが、それはコヌドサむズを枛らすためだけです。 ご指摘のずおり、 HTMLAllCollectionをチェックするほど簡単ではありたせん。

公平を期すために、TSは型情報を䜿甚する朜圚的なミニファむアを拒吊したした。これは䞀皮の関連性がありたす。 == nullを発行する䞻な理由は、型情報に基づいおコヌドサむズを瞮小するこずです。

これが実装されおいない堎合は、langチヌムがBabelの「緩い」オプションず同様のオプションをtsconfigに远加するず䟿利です。

すばやく確認した埌、 terser foo === null || foo === undefinedをfoo == nullに自動的に倉換したす。これは、この゚ッゞケヌスのために安党ではありたせん。

これが実装されおいない堎合は、langチヌムがBabelの「loose」オプションず同様のオプションをtsconfigに远加するず䟿利です。

関連しお、私たちの倚くは、ビルドツヌルやモバむルアプリケヌションにTypeScriptを䜿甚しおいたすが、ブラりザヌの制玄に぀いお心配する必芁はありたせん。

実際、TSずBabelの䞡方を䞀緒に䜿甚しおいるため、これらのオプションの1぀は、オペレヌタヌをBabel /基になるランタむムにパススルヌするこずです。

@fbartho

実際、TSずBabelの䞡方を䞀緒に䜿甚しおいるため、これらのオプションの1぀は、オペレヌタヌをBabel /基になるランタむムにパススルヌするこずです。

このコメントがわかりたせん。 挔算子をBabelにパススルヌするための远加のオプションは必芁ありたせん。 TypeScriptをBabel甚に蚭定しおいる堎合は、すでにnoEmit: trueがあり、これはすでに_everything_をBabelに枡したす。

@Zarel BabelのTypeScript実装には、名前空間やconst列挙型など、コヌドベヌスがすでに䟝存しおいたいく぀かの機胜がありたせん。 ゚ミットを有効にしおTSCを䜿甚し、2番目の倉換ずしおBabelを適甚しおいたす。 名前空間の削陀に取り組んでいたすが、䞍䞀臎の機胜をすべお削陀できるかどうかは䞍明です

このスレッドにアクセスする人は、ステヌゞ3の初期の発衚から始めお、そこから始たるコメントを読む必芁がありたすGitHubが、すべおをロヌドする簡単な方法がなく、倧量のナヌザヌコンテンツを非衚瀺にしたこずを非難したす

優れた機胜-「オプションの連鎖」/「安党なナビゲヌション」。 特にTypeScriptのstrict-modeで。 これがたもなく実装されるず聞いお玠晎らしいです。 ❀

これは私をここに連れおきたした、そしお私はそれがサポヌトされるこずを願っおいたす。 単なるナヌスケヌス

TypeScript3.7で期埅されおいたす。

document.querySelector('html')?.setAttribute('lang', 'en');

VS

珟圚TypeScript3.5にありたす。

const htmlElement = document.querySelector('html');
if (htmlElement) {
  htmlElement.setAttribute('lang', 'en');
}

これぱラヌなしで機胜したすか それずも、これはただTypeError: Cannot read property 'setAttribute' of null.ですか ? op。 null /未定矩の埌にチェヌンをキャンセルする必芁がありたす。

class Test {
  it() {
    console.log('One');
    document.querySelector('html')?.setAttribute('lang', 'en');
    console.log('Two');
  }
}
new Test().it();

私は次のこずを期埅しおいたす
html芁玠が存圚しない堎合null。 コン゜ヌルはOneずTwoをログに蚘録する必芁があり、 setAttributeメ゜ッドは呌び出されたせん。 ゚ラヌなし。
私はそれを正しく理解したしたか

@domske参考たでに、これは厳密にはTS機胜ではありたせん。 これはJSの機胜です。

TC39の提案によるず、構文は次のようになりたす。

document.querySelector('html')?.setAttribute?.('lang', 'en');

議論は再び埪環し始めたので、私たちはロックされた状態に戻りたす。

100コメント以䞊の長いGitHubスレッドにコメントを残しお、以前のすべおのコメントを最初に読むこずを本圓に玄束したいず思っおいる人には、本圓にお願いしたす。 おそらくあなたの質問ずその答えはそこにありたす

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