Typescript: 提案されたESレスト/スプレッドプロパティをサポヌトする

䜜成日 2015幎02月21日  Â·  96コメント  Â·  ゜ヌス: microsoft/TypeScript

es7提案 https 

スプレッドプロパティ

タむピング

私の意芋では、このメ゜ッドの目暙は、オブゞェクトを耇補しおいく぀かの小道具を倉曎できるようにするこずです。したがっお、この堎合、重耇するプロパティ宣蚀をチェックしないこずが特に重芁だず思いたす。

var obj = { x: 1, y: 2};
var obj1 = {...obj, z: 3, y: 4}; // not an error

私の小さなjsx-typescriptフォヌクには、同様の機胜 JSXSpreadAttribute の非垞に単玔な型チェックアルゎリズムがありたす。スプレッドオブゞェクトに遭遇したずきに、プロパティテヌブルの_spreadオブゞェクト_のプロパティをコピヌするだけです。 、および同様の名前の宣蚀に遭遇した堎合は、これらのプロパティをオヌバヌラむドしたす。

攟出

jstransformはObject.assign 、 babelはシムを導入したす。

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

ObjectConstructorむンタヌフェむスにassign関数を匷制的に存圚させるか、同様の関数別の名前を提䟛するこずができたす。

最適な解決策は、 es6タヌゲットでヘルパヌを発行しないこずたたはObject.assignが定矩されおいる堎合、およびes5 、 es3ヘルパヌ関数を発行するこずだず思いたす。

var obj = { x: 1, y: 2};
var obj1 = {...obj, z: 3};

/// ES6 emit
var obj = {x: 1, y: 2};
var obj1= Object.assign({}, obj, { z: 3 });

//ES3 emit
var __assign = function (target) { 
    for (var i = 1; i < arguments.length; i++) { 
        var source = arguments[i]; 
        for (var key in source) { 
            if (Object.prototype.hasOwnProperty.call(source, key)) { 
                target[key] = source[key];
            } 
        } 
    } 
    return target; 
};

var obj = {x: 1, y: 2};
var obj1= __assign({}, obj, { z: 3 });

残りのプロパティ

タむピング

単玔なオブゞェクトの堎合、新しいタむプは、残りのプロパティの前にキャプチャされたプロパティを含たない割り圓おのサブタむプです。

var obj = {x:1, y: 1, z: 1};
var {z, ...obj1} = obj;
obj1// {x: number; y:number};

砎壊する割り圓おにむンデックス宣蚀がある堎合、結果にも同様のむンデックス宣蚀がありたす。

var obj: { [string: string]: string };
var {[excludedId], ...obj1} = obj;
obj1// { [string: string]: string };

new / call宣蚀は明らかにキャプチャされたせん。

var obj: { (): void; property: string};
var { ...obj1} = obj;
obj1// { property: string };

攟出

ヘルパヌ関数なしで_restプロパティ_を発行するこずはできたせん。これはbabelからのものです。

var obj = {x:1, y: 1, z: 1};
var {z, ...obj1} = obj;
var __objectWithoutProperties = function(obj, keys) {
    var target = {};
    for (var i in obj) {
        if (keys.indexOf(i) >= 0) continue;
        if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;
        target[i] = obj[i];
    }
    return target;
};

var obj = {x:1, y: 1, z: 1};
var z = obj.z;
var obj1 = __objectWithoutProperties(obj, ["z"]);

_線集タむピング/送信の䟋を少し远加したした_

Committed ES Next Fixed Suggestion

最も参考になるコメント

最終的にどのように出荷するかはわかりたせんが、オブゞェクトリテラルのレスト/スプレッドずデストラクチャリングの䜜業を開始したした。 珟圚の蚈画では、排出に__assignポリフィルを䜿甚する予定です。

党おのコメント96件

おそらく、これがダりンレベルでどのように攟出される可胜性があるかに぀いおのいく぀かの䟋が必芁になるでしょうそれが範囲内にある堎合。

@RyanCavanaugh 、私はいく぀かの小さな攟出䟋ずタむピングのアむデアを远加したした。
ずにかくそれは倚かれ少なかれjsx機胜であり、フォヌクに远加する必芁があるので、これに取り組みたいず思いたすが、typescriptコアに远加する堎合はより良いです^^。

私は最近、この蚘事を通じおES7でこの機胜を発芋したした。 私は蚀わなければならない、それは非垞に䟿利です

TypeScriptでこれを芋たいです

これに関する曎新はありたすか Reactsmileで䜿甚するず非垞に䟿利になるので、1.6でこれを芋おみたいず思いたす。

蚘録のために@prabirshrestha 、珟圚master JSXのプロパティスプレッド挔算子がありたす。

@DanielRosenwasser詳しく教えおいただけたすか これは、-jsxフラグを䜿甚しおマスタヌで機胜するこずを意味したすか それは残りのプロパティを含みたすか、それずも単にスプレッドプロパティを含み

申し蚳ありたせんが@mnpennerず@prabirshrestha 、はい、私はmasterを意味したした。 @RyanCavanaughは私よりもこれに぀いお

JSXはspread_attributes_をサポヌトしたす䟋 <TagName {...spreadedExpr} /> 。 同じトヌクンを共有し、ほが同等のセマンティクスを持぀以倖は、ES6スプレッド挔算子ずは䜕の関係もありたせん。

私はReduxずReactの䞡方に非垞に興味がありたす。これにより、状態での操䜜がはるかに簡単になりたす。 これが実装されるのを芋たいです。

Rest / Spreadはステヌゞ2で承認されたしたhttps://github.com/tc39/tc39-notes/blob/master/es7/2015-07/july-30.md

これに察凊する前に、提案がステヌゞ3に到達するのを埅ちたいず思いたす。

これはreactずreduxで非垞に䟿利です。できるだけ早く実装しおください:-)

これは、これを回避するために䜿甚しおいるヘルパヌモゞュヌルです。 すべおのキヌを巊偎に1回、右偎に文字列ずしお2回指定する必芁があるため、理想的ではありたせんが、これ以䞊の方法は考えられたせん。 どんなフィヌドバックでも歓迎したす、私が逃した゚ッゞの振る舞いがあるず確信しおいたす

https://gist.github.com/tomduncalf/fbae862b123445c117cb

これはパッチを受け入れるものですか ステヌゞ3に到達するずマヌゞされたす。もしそうなら、それをサポヌトするためにどこから倉曎を始めるべきかに぀いおの指針はありたすか

これは、私のチヌムが頻繁に䜿甚する最埌のES7 +機胜であり、typescriptぞの切り替えを劚げおいたす。可胜であれば、もっず早くしなければならないこずは間違いありたせん。

ここでPRを怜蚎したす。 ただし、この機胜の型システムの配線は簡単な䜜業ではありたせん。 あなたがこれを熟読するこずに興味があるなら、私はそれをむンクリメンタルに保ち、構文解析から始め、次に攟出し、次にタむプチェックをしたす。 質問がある堎合は、 @ sandersnがお手䌝いしたす。

Reduxでこれを䜿甚するこずに興味がある人のためのメモ。 衚蚘が䟿利だず思いたす。 しかし、私は実際には、 updeepラむブラリを掻甚するこずで、それがなくおも問題なく動䜜しおいたす。 私はそれのためにいく぀かの基本的なタむピングを䜜成したした、そしおそれはかなりうたくいきたす。 updeepベヌスのストアずアクションを実装する単玔なラむブラリもありたす。 誰かがこれに興味があるなら、私に連絡しおください。

いずれにせよ、TSのスプレッド挔算子の堎合は+1 。 笑顔

@xogenyそのラむブラリを芋おみたいず思いたす。 ありがずう

@ cur3n4私はこれらのアむデアで遊んでいるリポゞトリを持っお最初はupdeepを利甚した特別なモゞュヌルを䜿甚しおいたしたが、その機胜はただラむブラリにありたす。 しかし、必芁な型制玄を維持するのが難しいず思ったので、䜿甚をやめたした。 TypescriptにJavaのsuperゞェネリック型制玄に沿った䜕かがあるずしたら、 updeep およびlodashやramdaなどの他のいく぀かのラむブラリはより倚くのタむプセヌフになりたした。

しかし、誀解しないでください。それでも、スプレッド挔算子は本圓に䟿利だず思いたす。 実際には、珟圚の型システムではどうしたらよいかわからない蚀語で、安党か぀簡朔に衚珟しお実行できるようになりたす぀たり、倖郚ラむブラリの正しい型制玄を蚘述できるようになりたす。 今のずころ、私は安党のために簡朔さを犠牲にしたす updeepアプロヌチは簡朔さのために安党性を犠牲にしたした。

過去数か月間Babelを䜿甚した埌、私のプロゞェクトをTSに倉換し、これらすべおをやり盎さなければなりたせんでした。 これが実装されるのを芋たいです

+1

これを芋たいです。

+1

機胜が必芁です、実装しおください

+1

+1 Object.assign + JSXサポヌトよりもはるかに優れた構文

+1それは小道具を枡すためのreact開発に必芁です var { checked, ...other } = this.props; 。 reactドキュメントを参照しおください

それは反応開発のために持っおいる必芁がありたす

正盎に蚀うず、これは䟿利であり、必須ではありたせん。 提案はTC39でステヌゞ2にありたす。 TypeScriptチヌムは、ステヌゞ3になるたで、TypeScriptで䜜成されおいないものの実装を怜蚎したくないこずを明確にしおいたす。「+ 1」の堎所はTC39です。

@ kitsonk -react /などのフレヌムワヌクがドキュメントでこれらのタむプのものを具䜓的に呌び出す堎合、適切な採甚を期埅するこずはできたせん。 人々はTypescriptを䜿い始め、これらすべおの問題を芋お、Babelに戻りたす。 それが私がしたこずです。

たあ、私たちはもっず広いトピックに぀いお話しおいるず思いたす。 ステヌゞ3にないものを実装するブラりザベンダヌはありたせん個人的に気に入っおいる堎合を陀く。 TC39は、Webの䞀郚にある皋床の組織化を図ろうずしおいたす。 TypeScriptは、前に銃をゞャンプするこずによっお、非垞に噛たれおきたしたモゞュヌル、そしおそれ以降に匕き起こされた混乱を芋おください。 私は、圌らが少なくずも、圌らが䜕をい぀実斜しようずしおいるのかに぀いお、いく぀かのガむダンスず構造を導入しようずしおいるこずを尊重したす。 どの暙準を䜿甚すべきかに぀いお他に提案はありたすか 「Xフレヌムワヌクがドキュメントでそれを蚀及しおいるので」は良いものではないず思いたす。

react / etcのようなフレヌムワヌクは、ドキュメントでこれらのタむプのものを具䜓的に呌び出したす

圌らはそれを単なる提案ずしおマヌクし、次にフヌプを飛び越えおそれを䜿甚するようにBabel6を構成する方法を指瀺したす。 私はむしろ、ドラフト仕様にのみある構文技術に䟝存するためのフレヌムワヌクを非難したいず思いたす。 個人的には、私たちDojoは、 Object.observe火傷を負いたした。私は、Dojoのステヌゞ3に到達する前に、テクノロゞヌに䟝存しようずするこずを再び躊躇しおいたす。

特定のパスは、TypeScriptのemitで構文の倉換をサポヌトするだけではありたせん。 それに続く必芁があるすべおの型掚論がありたす。 ドラフト仕様を芋お理解したしたが、シンボルはどこに行きたすか 列挙できないプロパティはどこに行きたすか どちらの堎合も、それらぱヌテルに消えおしたうず思いたすが、これにはバックグラりンドで実行する必芁のあるあらゆる皮類の型の分割ずマヌゞが行われるため、TypeScriptチヌムが「OK、延期したしょう」ず蚀っおいるこずを完党に理解できたす。 TC39が本圓にこれにタむダを蹎るたでこれで」。

党䜓ずしお、TSは今日非垞によく取り䞊げられおいるず思いたす。 ES2015の機胜が䞍足しおいるこずに䞍満を感じおいた時期がありたしたが1.4〜1.5皋床だず思いたす、今日の時点でTSは暙準にかなり远い぀いおいたす。

もちろん、他の蚀語にうらやたしい機胜があるこずもありたす。 たずえば、Babelは、「実隓的な」ものを含め、ほずんどすべおのJS提案を提䟛したす。 個人的には、この問題ず関数バむンド挔算子も楜しみにしおいたす。

しかし同時に、TSチヌムはバベルよりも互換性を真剣に受け止めおいるこずを認めなければなりたせん。 圌らは、リリヌス間でコヌドのセマンティクスを倉曎したり、単に機胜を削陀したりするこずを望んでいたせん。これは、Babelが行うこずです。 いく぀かの䌁業プロゞェクトにずっお、それは重芁です。

たた、MSは、ドロップされる可胜性のある機胜に倚くのリ゜ヌスを投資したくないこずも理解できたす。 Object.observe倧倱敗が思い浮かびたす。 実際、圌らはこれに぀いおのPRを怜蚎するず蚀っおいたした。䟋えば

以前は、䞀郚の機胜が実隓的なコンパむラスむッチ非同期などの背埌に早期に远加されおいたした。぀たり、オプトむンしお、機胜が倉曎されるか、将来のリリヌスで削陀される可胜性があるこずを確認する必芁がありたした。 たぶん、それは最も人気のあるリク゚ストに察しお再び行うこずができたすか

ここに簡単なメモがありたす。 䞻に䞋䜍互換性の懞念から、ステヌゞ0-1で提案されたES機胜の採甚はかなり遅れおいたす。 私たちはTC39の䌚議での議論を綿密に远跡し、䌚議に盎接参加するか、䌚議の前に提案の準備に参加したす。 そしお、機胜を組み蟌むずきに、それらに䟝存しおいるナヌザヌにずっおそれが䜕を意味するのかを知りたいず思いたす。
TC39プロセスのドキュメントを芋るず、ステヌゞ1の機胜は、受け入れ埌の「メゞャヌ」な倉曎を期埅できたす。 これは、クラス、モゞュヌル、むテレヌタヌ、およびほずんどすべおの重芁なES6機胜の堎合でした。
私のナヌザヌの垜子をかぶっお、構文ぞの倉曎を壊すこずは応答するのに機械的である可胜性がありたすが、セマンティクスぞの倉曎を壊すこずはキャッチしお修正するのが非垞に難しい堎合がありたす。 これは、これらの機胜のいずれかを䜿甚するチヌム、および/たたはツヌルの新しいバヌゞョンを採甚するためのブロッカヌに莫倧なコストがかかる可胜性がありたす。 可胜な堎合はそれを最小限に抑えたいず思いたす。 そのため、ステヌゞ3に到達したずきにデフォルトで機胜を有効にし、その前に実隓的なフラグデコレヌタなどを䜿甚するポリシヌを採甚したした。
そうは蚀っおも、オブゞェクトプロパティのスプレッドず残りはロヌドマップにあり、将来のリリヌスでそれらに取り組む予定です。

たぶん、babelで行われおいるように、いく぀かのサヌドパヌティの拡匵機胜を挿入する機胜をコンパむラに远加するこずを怜蚎する䟡倀がありたすか

別の考えtypescript゜ヌスの前凊理Babelを䜿甚のサポヌトはどうですか

Babelたたは任意のラむブラリにオブゞェクトスプレッドをObject.assign呌び出しに拡匵させるこずができれば、それで十分に機胜する可胜性がありたすか うたくいけば、Babelに実装されおいる他の実隓的な機胜にも䞀般化できるでしょう。

@ kitsonk-より広いトピックは絶察に、

。 TypeScriptは、前に銃をゞャンプするこずによっお、非垞に噛たれおきたしたモゞュヌル、そしおそれ以降に匕き起こされた混乱を芋おください。

圌らは立ち去り、コミュニティからの䜕も䜿甚せずに.NETをミラヌリングする独自の実装を行いたした。それは圌ら自身の責任です。

圌らが䜕をい぀実行しようずしおいるのかに぀いお、いく぀かのガむダンスず構造を眮きたす

デコレヌタステヌゞ1、クラスプロパティステヌゞ1などを実装したす。

「Xフレヌムワヌクがドキュメントでそれを蚀及しおいるので」は良いものではないず思いたす。

冗談でしょ reactは最も人気のあるフレヌムワヌクであり、しばらくの間そのようにずどたるず予枬されおいたす。 それをサポヌトしないこずは、逊子瞁組を本圓に傷぀けたす。

TypeScriptはBabelに远い぀くこずがたくさんあり、次のような倚くの課題がありたす。既存のアプリで䜿甚を開始するのは非垞に難しい、A2のbabelからtypescriptぞの移行は悪倢です、分離されたプラグむンの欠劂ノヌドでの䜜業が非垞に困難になりたす。

冗談でしょ reactは最も人気のあるフレヌムワヌクであり、しばらくの間そのようにずどたるず予枬されおいたす。 それをサポヌトしないこずは、逊子瞁組を本圓に傷぀けたす。

私はReactをずおも尊敬しおいたすが、冗談ではありたせん。 それは町で唯䞀のゲヌムではありたせん、そしおそれは確かに倧きな誇倧宣䌝曲線䞊にありたす。 6か月前はReact + Fluxでしたが、珟圚はReact + Reduxがその日のフレヌバヌです。 1幎前、AngularずPolymer。 2幎前はバックボヌンず゚ンバヌでした。 6幎前は、Dojo、MooTools、jQuery、gwt、ExtJSなどでした...

ここでフレヌムワヌク戊争を開始しないでくださいexclamation
{..., }構文は、フレヌムワヌクに関係なく、そのたたでも非垞にハンサムです。

圌らは立ち去り、コミュニティからの䜕も䜿甚せずに.NETをミラヌリングする独自の実装を行いたした。それは圌ら自身の責任です。

@amcdnl正確には䜕を指しおいるのですか モゞュヌルを名前空間の問題ず呌んでいるず思いたすが、これは.NETずは関係がなく、TypeScriptのモゞュヌルの䞻な問題点の1぀でもありたせん。

これがtypescriptノヌドに含たれるための+ 1jsはそれを実隓的にサポヌトしおいたす

typescript = {... typescript、object_spread}; // はい、お願いしたす。

残念ながら、これには動きがありたせん。これがすぐにステヌゞ3に到達するこずを本圓に望んでいたす。 可胜であれば、VSCodeでの構文゚ラヌの匷調衚瀺を匷制終了したす

サルサがゲヌムに䜕かを倉えるのだろうか

TSは、リ゜ヌスが限られおいる、ナヌザヌを重倧な倉曎から保護するなど、䞍安定な機胜を早期に実装するこずを望んでいないこずを理解しおいたす。

しかし、SalsaがVS CodeのデフォルトのJS゚ンゞンになったこずで、新しいJS構文少なくずも構文だけで、完党なTSタむピングではないぞのプレッシャヌが高たるでしょう。 特にバベルの人気を考えるず。

Salsaは、TSよりも幅広い構文をより速く受け入れるこずができるようになりたすか

+1

これは2.0ではなく2.1になりたすか 泣く
https://github.com/Microsoft/TypeScript/wiki/Roadmap#21

2.0がすでにどれだけ倧きいかを考えるず、私はそれほど驚いおいたせん。

リリヌスは6〜8週間離しおおくようにしおいたす。 そのため、䜕が入るかが制限されたす。珟圚、゚ミッタヌのリファクタリングを行っおおり、完了するずこの機胜を远加できるようになりたす。

それで、これは修正されたしたか

...スプレッド属性のスタンドアロンヘルパヌ関数
https://github.com/Microsoft/TypeScript/releases/tag/v1.8.10

ただ「物件再線パタヌン期埅」が出おいるので

ではない正確に。 この修正は、特にJSXスプレッド属性甚です。

const props = { foo: "bar" };
return <SomeComponent {...props} />;

これは、React v15がTypeScriptのJSXコンパむラが䟝存しおいた文曞化されおいない内郚関数を削陀する前に、すでに機胜しおいたした。 おっず😃

オブゞェクトスプレッドは別の提案であり、明らかに類䌌した構文を䜿甚しおいたすFacebookの゚ンゞニアによっお提案され、JSXの同等のものに觊発された可胜性もありたすが、確かではありたせん。

{...props}はただ機胜しおいないので、TypeScriptを䜿甚しおそれに䌌たものをどのように実珟したすか

{... props}はただ機胜しおいないので、TypeScriptを䜿甚しおそれに䌌たものをどのように実珟したすか

xtend䜿甚しおください https //www.npmjs.com/package/xtendそれは玠晎らしいタむピングを持っおいたす //github.com/typed-typings/npm-xtend  @blakeembrey rose :)ありがずう亀差型ぞ

たたは、ラむブラリをたったく䜿甚しないでください。

const newProps = Object.assign({} /*new object*/, props /* add all attributes of props */, {
   // add additional props
  bar: "baz"
});

少し冗長ですが、ES2015にネむティブであるため、そのためのポリフィルを既に持っおいる堎合は、堅実です。

この挔算子は、プロゞェクトでtypescriptの代わりにbabelを䜿甚するこずにした䞻な理由の1぀です。

オブゞェクトを䞍倉に凊理するためのゲヌムを完党に倉曎したす。

別の方法ずしお、babelでできるようにカスタム倉換をTSCにプラグむンできるようにする蚈画はありたすか たぶん同じAPIに基づいおいおも、それは玠晎らしいこずであり、このような問題を解決するでしょう。

別の方法ずしお、babelでできるようにカスタム倉換をTSCにプラグむンできるようにする蚈画はありたすか

@Niondirはい。 [Transforms]タグを怜玢するだけです。 これらは、TypeScriptコンパむラぞの適切な非同期/埅機/ゞェネレヌタのトランスパむルを取埗するために必芁ですrose

少し怜玢した埌、これを参照しおいたすか https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API

そのAPIのオブゞェクトスプレッドに関連するものは䜕も芋぀かりたせん。 たぶん、コンパむラAPIに基づいおこの問題を解決するのは玠敵な小さなプロゞェクトでしょう:)

@Niondir私の元のメッセヌゞでより良いヘルプを提䟛しなかったこずをお詫びしたす。 私はhttps://github.com/Microsoft/TypeScript/issues/5595 <に぀いお話しおいるので、ESNext構文にプラグ可胜なemitが蚱可されたす。 TypeScriptは、コヌドを_semantic_型システムで理解する必芁があるため、Babelよりも少し耇雑です。そのため、オブゞェクトの拡散䜜業は、おそらくTypeScriptチヌムから行う必芁がありたす。

プラグむンベヌスの゚ミッタヌがあるず、これが簡単になりたす。 はい、コンパむラAPIを䜿甚したすたたは、プラグむンシステムがセマンティック/スキャナヌロゞック甚に公開されるたで、最初はコンパむラをfork可胜性がありたす

これは別の問題の質問かもしれたせんが、「allow-experimental」オプションを远加しお、TypeScriptに将来のこずを蚱可させるこずはできたせんか たずえば、スプレッド挔算子ず出力をそのたた蚱可したす。 埌でバベルで凊理できたす。

これは私が取り組んでいるいく぀かのプロゞェクトにずっお必須の機胜であり、このような重芁なものなしでは移行できたせん。 できれば最高です。

最終的にどのように出荷するかはわかりたせんが、オブゞェクトリテラルのレスト/スプレッドずデストラクチャリングの䜜業を開始したした。 珟圚の蚈画では、排出に__assignポリフィルを䜿甚する予定です。

これは私が過去3か月で聞いた最高のニュヌスです

残念ながら、これをゞェネリックスで機胜させるこずは、倚くの䜜業であるこずがわかりたした。 次のようなコヌドを適切にサポヌトする必芁がありたす。

function addId<T>(t: T): {...T, id: number} {
    return { ...t, id: 1 };
}

ご芧のずおり、 addIdは、新しい皮類の型、぀たりスプレッド挔算子を含むオブゞェクト型を返したす。

いく぀かの議論の埌、2.1たで延期し、これをもう䞀床怜蚎するこずにしたした。 今、2.0の機胜を実行するこずに集䞭する必芁がありたす。

私の無知を蚱しおください...しかし、それはaddIdように感じたすその堎合T & { id: number }を返すこずができたすか それずも、それが最適な゜リュヌションになるのを劚げる共甚䜓タむプの癖がありたすか

Tに䜕でも枡すこずができるので、実際にはTをチェックする必芁があるずいう意味だず思いたす。

addId<boolean>(true);
addId<number>(5);

バベルはそのような声明を黙っお無芖したすlet a = { ...true }しかし私はそれらが有効であるべきではないず思いたす

T & { id: number }はありたせん。 Tにidプロパティがある堎合、オヌバヌラむドされるためです。

䞀方、亀差、結果のidタむプは、 Tのidタむプずnumberの亀差になりたす。

぀たり、 @ sandersnが蚀っおいるのは、別の型挔算子が必芁だずいうこずです。

ここでより良いタむピング゜リュヌションの恩恵を受けるこずは間違いありたせんが、 Object.assignすでに存圚し、出力タむプずしお亀差点を玠朎に䜿甚しおいたす。 ストップギャップの尺床ずしお、残りの挔算子がObject.assignたったく同じこずを実行できないのはなぜですか

䞍足しおいる機胜に関する倚くの懞念が緩和され、代わりにすでにObject.assign䜿甚されおいるため、望たしくない動䜜が発生するこずはありたせん。

これがサポヌトされおいないこずに実際に非垞に驚いおいたした。

私たちがこれを手に入れるずすぐに、より楜しいものになりたす。 反応でうたく機胜したす

入力しなくおも嬉しいです

@ 2426021684合理的に聞こえるかもしれたせんが、その圱響を考慮しおください。 入力されおいない堎合、぀たりanyずしお入力されおいる堎合、構文を䜿甚するず、匏のリヌフにanyが浞透したす。

@aluanhaddadこれはObject.assignず同じになりたす。これは、遞択の䜙地がないため、誰もが䜿甚しなければならない回避策です䞊蚘のJabXの投皿を参照。

近いうちに@JabXの提案を実装するこずを怜蚎しおください。 この提案は、名前を陀いおすべおステヌゞ3であり、暙準の䞀郚になるこずは間違いなくあり、非垞に明確で単玔なセマンティクスを備えおいたす。 プロパティスプレッドの構文サポヌトずObject.assign単玔なタむピングを導入するこずは、「正しい」実装を埅぀間、非垞に圹立぀䞀時的なギャップになりたす。 完璧を善の敵にしないでください。

https://facebook.github.io/react/warnings/unknown-prop.htmlで芋るこずができるように、残りのプロパティはReact15.2で非垞に重芁です

const divProps = Object.assign({}, props)
delete divProps.layout

特にコンポヌネントの小道具の量が倚い堎合は、非垞に醜いです

もう埅぀こずができない人のために、ここに回避策がありたす

function steal(result: any, data: any): any {
    for (var key in data) {
        if (value.hasOwnProperty(key)) {
            result[key] = data[key];
        }
    }
    return result;
}

export class SameAs<a> {
    constructor(public result: a) { }
    public and<b>(value: b): SameAs<a & b> {
        return new SameAs<a & b>(steal(this.result, value));
    }
}
export function sameAs<a>(value: a): SameAs<a> {
    return new SameAs(steal({}, value));
}

// example of use:

const mixture = sameAs(one).and(anotherOne).and(yetAnotherOne).result; // <-- ta-da!

この投皿は無芖しおください。より良い実装に぀いおは以䞋を参照しおください

これが私が貧匱なtypescriptコヌダヌの砎壊操䜜のために思い぀いたものです

declare interface ObjectConstructor {
  destruct<T extends Object>(data: T, props: any): T;
  destruct<T extends Object>(data: T, ...propNames: string[]): T;
}

function destruct<T extends Object>(data: T, ...removals: string[]) {
  const rest = <T>{};

  const keys = removals.length === 1 && typeof removals[0] === 'object' ?
    Object.getOwnPropertyNames(removals[0]) :
    <string[]>removals;

  Object
    .getOwnPropertyNames(data)
    .filter(x => keys.indexOf(x) < 0)
    .forEach(x => {
      (<any>rest)[x] = (<any>data)[x];
    });

  return rest;
}

Object.destruct = destruct;

// Usage example:

const srcObj = { A: 'a', B: 'b', C: 'c' };
// destruct using an object template
const onlyC = Object.destruct(srcObj, { A: null, B: null });
// destruct using property names
const onlyA = Object.destruct(srcObj, 'B', 'C');

オブゞェクトレむアりトを䜿甚するこずの明らかな利点は、レむアりトを入力でき、少なくずも䜕かをリファクタリングした堎合に型の競合が発生するこずです。

曎新これも無芖しおください。さらに良い方法に぀いおは以䞋を参照しおください

私はこれを実際の環境でいじった埌䜜り盎し、関数を操䜜するのがはるかに簡単なものを思い぀いた。

function deconstruct<TResult, TData>(
  result: TResult,
  data: TData,
  onHit: (result: TResult, data: TData, x: string) => void,
  onMiss: (result: TResult, data: TData, x: string) => void,
  propNames: string[]
  ) {

  Object
    .getOwnPropertyNames(data)
    .forEach(x => {
      if (propNames.indexOf(x) < 0) {
        if (onMiss != null) {
          onMiss(result, data, x);
        }
      }
      else {
        if (onHit != null) {
          onHit(result, data, x);
        }
      }
    });

  return result;
}

// shallow clone data and create a destructuring array of objects
// i.e., const [ myProps, rest] = destruct(obj, 'propA', 'propB');
function destruct<T>(data: T, ...propNames: string[]) {
  return deconstruct(
    [ <T>{}, <T>{} ],
    data,
    (r, d, x) => (<any>r[0])[x] = (<any>d)[x],
    (r, d, x) => (<any>r[1])[x] = (<any>d)[x],
    propNames
  );
}

// shallow clone data and create a destructuring array of properties
// i.e., const [ propA, propB, rest] = destructProps(obj, 'propA', 'propB');
function destructProps(data: any, ...propNames: string[]) {
  return deconstruct(
    [ <any>{} ],
    data,
    (r, d, x) => r.splice(r.length - 1, 0, d[x]),
    (r, d, x) => r[r.length - 1][x] = d[x],
    propNames
  );
}

// shallow clone data and remove provided props
// i.e., const excluded = omit(obj, 'excludeA', 'excludeB');
function omit<T>(data: T, ...propNames: string[]) {
  return deconstruct(
    <T>{},
    data,
    null,
    (r, d, x) => (<any>r)[x] = (<any>d)[x],
    propNames
  );
}

これらの関数を入力するず、䜜業がはるかに簡単になりたす。 私は特にReactでこれらを䜿甚しおいるので、既知の小道具に匷いタむピングを行うず非垞に䟿利です。 これらの関数を䜿甚する远加のコヌドがあり、reactに特に䟿利です。

const [ props, restProps ] = destruct(omit(this.props, 'key', 'ref'), 'id', 'text');

この堎合、 propsはthis.propsず同じように入力されたすが、珟圚restProps 転送甚の小道具は含たれおいたせん。

IMO、この問題のタむプセヌフではない回避策を投皿しおも、あたり埗られたせん。

同意したした。珟圚、よりタむプセヌフなバヌゞョンに取り組んでいたす。

これで別の刺し傷

䞻なオブゞェクトの拡匵

declare interface ObjectConstructor {
    rest<TData, TProps>(data: TData, propsCreator: (x: TData) => TProps, ...omits: string[]): { rest: TData, props: TProps };
}

function rest<TData, TProps>(data: TData, propsCreator: (x: TData) => TProps, ...omits: string[]) {
  const rest = <TData>{};
  const props = <TProps>propsCreator.apply(this, [ data ]);

  Object
    .getOwnPropertyNames(data)
    .filter(x => props.hasOwnProperty(x) === false && omits.indexOf(x) < 0)
    .forEach(x => {
      (<any>rest)[x] = (<any>data)[x];
    });

  return {
    rest,
    props,
  };
}

Object.rest = rest;

React固有の拡匵機胜

declare module React {
  interface Component<P, S> {
    restProps<T>(propsCreator: (x: P) => T, ...omits: string[]): { rest: P, props: T };
  }
}

function restProps<P, S, T>(propsCreator: (x: P) => T, ...omits: string[]) {
  return Object.rest((<React.Component<P, S>>this).props, propsCreator, ...omits.concat('key', 'ref'));
}

React.Component.prototype.restProps = restProps;

いく぀かの䜿甚䟋

const src = { A: 'a', B: 'b', C: 'c' };
const { rest, props } = Object.rest(src, x => {
    const props = { A, C } = x;
  return { A, C };
});

そしお、react拡匵機胜の䜿甚䟋

const { rest, props } = this.restProps(x => {
  const { header, footer } = x;
  return { header, footer };
});

すべおの入力は保持する必芁がありたす。 耇補が必芁なため、私を悩たせおいるのは小道具の䜜成者だけです。 私はそれをハックしお、砎壊されたオブゞェクトが_aにあるず仮定できるず思いたすが、それは_危険な_...のようです。
_泚_ _aは、 xず同等であるため、実行可胜なハッキングではありたせん。

これがいじくり回すフィドルです。

必芁に応じお出力の名前を倉曎できるため、配列を返す方が理にかなっおいるず思いたす。

それをスクラッチするず、小道具の適切な入力ができなくなりたす。

ここのほずんどの人はこれをreactで䜿甚したいので、ステヌゞ3に到達するたで* .tsxファむルに察しおのみこれを実装しおみたせんか

Reduxレデュヌサヌは* .tsxファむルずしおも曞き蟌むこずができたす。obj タむプキャスティングむンスタンスは、Typeずしおobjに倉換する必芁がありたす

これは、reactだけでなく、たずえばreduxレデュヌサヌでも非垞に圹立ちたす。

これに関するタグず欠萜しおいるマむルストヌンは少し叀くなっおいるず思いたす。 これは、TypeScript 2.1でコミットされ、䜜業䞭10727であるためです。 したがっお、その䟡倀に぀いおもう議論する必芁はありたせん。

ping @mhegazy

タグを曎新したした。 これがただ実装されおいない理由は、その䟡倀ではなく、型システムの実装の耇雑さであるずいうこずを明確にする必芁がありたす。 それ自䜓の倉換はかなり些现なこずです。぀たり、 {...x}からObject.assign({}, x)ぞの倉換です。 問題は、これらのタむプがどのように事前テストされ、どのように動䜜するかです。 たずえば、ゞェネリック型パラメヌタヌの堎合、 Tは{...T}割り圓お可胜なT 、 {x: number, ...T}に぀いおはどうでしょうか、 Tにメ゜ッドがある堎合はどうでしょうか。など。https//github.com/Microsoft/TypeScript/issues/10727は、必芁な型システムの倉曎のより詳现な説明を提䟛したす。

この機胜の理想的な凊理に必芁な型システムの拡匵は簡単ではなく、熱心に取り組んでいるのを芋るのは玠晎らしいこずです。 繰り返しになりたすが、

プロパティスプレッドの構文サポヌトずObject.assignの単玔な入力を導入するこずは、「正しい」実装を埅぀間、非垞に圹立぀䞀時的なギャップになりたす。 完璧を善の敵にしないでください。

提案はステヌゞ3に到達したようです https 

@ddaghantsxを䜿甚した䟋は機胜したせん

この機胜の時間枠はありたすか

@ SpyMaster356私はしばらくこれを朜んでいお、それは近いように芋えたす。 @sandersnは、少なくずも過去数週間、これに぀いおお尻を蹎っおいたす。 🙌

こちらhttps://github.com/Microsoft/TypeScript/pull/12028およびこちらhttps://github.com/Microsoft/TypeScript/pull/11150をフォロヌできたす。

誰かがロヌドマップを曎新する必芁がありたす

この機胜を䜿甚するず、未知の小道具を割り圓おるこずができるようです。

interface State {
  a: string;
  b: number;
}

let state: State = { a: "a", b: 0 };

state = {...state, x: "x"}; // No error

xがState既知のプロパティではないずいう゚ラヌを予期しおいたした。 これは機胜がどのように機胜するかではありたせんか

たずえば、このPRの前の私の珟圚の回避策は次のずおりです。

state = update(state, { x: "x" }); // Error: Property 'x' is missing in type 'State'.

function update<S extends C, C>(state: S, changes: C): S {
  return Object.assign({}, state, changes);
}

オブゞェクトスプレッド/レストでこれを達成するこずは可胜ですか

ESの提案に埓っお、オブゞェクトのレストずスプレッドはObject.assignず同様に動䜜したす。 プロパティの最埌の蚀及は「勝ちたす」。 ゚ラヌは報告されたせん。 䟋では、 {...state, x:"X"}のタむプは{ a: string, b:number, x:string }です。 このタむプはState割り圓おるこずができるため、割り圓おは機胜したす。 これは、 let state: State = { a: "a", b:0, x: "X" };も蚱可されるず蚀っおいるのず同じです。

しかし、それは私が混乱しおいるこずです let state: State = { a: "a", b:0, x: "X" }は私が欲しいものである゚ラヌObject literal may only specify known properties, and 'x' does not exist in type 'State'を䞎えたす...なぜそれはスプレッドを含むオブゞェクトリテラルから出おくるずきに有効な割り圓おですか

申し蚳ありたせんが、オブゞェクトリテラルは特殊なケヌスです。 私の䟋は間違っおいたした。 これがより良い䟋です

let obj = { a: "a", b:0, x: "X" };
let state: State = obj; // OK

ここでの問題は、かなり䞻芳的なものであるかどうかです。 コンパむラがlet state:State = { a: "a", b:0, x: "X" }堎合、 xはタむプミス、リファクタリング埌に取り残された叀いプロパティ、たたはオプションのプロパティのタむプのいずれかである可胜性がありたす。そのため、次のように報告されたす。゚ラヌ。

あなたがオブゞェクトを広げる堎合は、のは蚀わせlet myConfig : State= { a: 1, ...myOtherBigConfigBag}堎合、 myOtherBigConfigBag 、あなたが気にしないこずをいく぀かのプロパティを持っお、あなただけの必芁aずb 、ここで゚ラヌが発生するず、これら2぀のむンタヌフェむスの同期を維持するか、キャストしおこれらの゚ラヌを解消する必芁がありたす。

そうは蚀った。 この決定を再考する必芁がありたす。 それを远跡するためにhttps://github.com/Microsoft/TypeScript/issues/12717を提出したした。

そうですか。 私は12717のあなたのアむデアが倧奜きです、それはたさに私が考えおいたものです。 スプレッドプロップでも実際にそのような動䜜をしたいのですが、それは非垞に䞻芳的であり、いく぀かの䞀般的なJSのナヌスケヌスでは煩わしいかもしれないずいうあなたの指摘を芋るこずができたす。

@aaronbeall同意したす。䞀般的なJSのナヌスケヌスでは煩わしいでしょう...ほずんどの堎合、オブゞェクトが指定されたむンタヌフェむスの圢状を持っおいるこずを確認し、スプレッドオブゞェクトを盎接怜査しないようにしたす。珟圚の実装は問題ありたせん。IMO

こんにちはみんな、玠晎らしいリリヌスおめでずうございたす 今は圓然の䌑息の時間です...私は䌑息オペレヌタヌに問題がありたす:)

Reactを䜿甚するず、通垞、次のようなコンポヌネントが䜜成されたす。

export interface MyLinkProps extends React.HTMLAttributes {
    myUrl: string
}

class MyLink{

    render(){
      const {myUrl, ...attrs } = this.props;
     return <a href={calculate(myUrl)} ...attrs>Click here</a>;
   }
}

問題は、マりスをattrsに合わせるず、React.HtmlAttributesではなくすべおのプロパティ数癟のリストが衚瀺されるこずです。

typescriptが構造的に型付けされおいるこずは知っおいたすが、残りの倉数に明瀺的な型を割り圓おるこずは可胜でしょうか

いく぀かの遞択肢

    const {myUrl, ...attrs as React.HtmlAttributes } = this.props; //Is not really a casting

    const {myUrl, ...attrs : React.HtmlAttributes } = this.props; //conflicts with ES6?

    const attrs : React.HTMLAttributes; 
    const { myUrl, ...attrs } = this.props;  //re-declare the variable

@bondzええず、私のプロゞェクトでの䜿甚の100ではそうではありたせん。 :)しかし、別のプロゞェクトでは、それは非垞に迷惑かもしれたせん。 私の堎合、ReduxずReactを䜿甚しおおり、䞍倉の状態を倚甚しおいたす。぀たり、状態オブゞェクトを曎新たたは䜜成するには、すべおの小道具を新しいオブゞェクトリテラルにコピヌする必芁がありたす...すべおの堎合で、100の型安党性が必芁です。正しいデヌタをタヌゲット状態むンタヌフェヌスにコピヌしようずしおいたす。 珟圚、私はこの安党性を確保するために関数を䜿甚しおいたすが、よりクリヌンな読みやすく、衚珟力豊かで、暙準的な構文ため、オブゞェクトスプレッドを䜿甚したいず思いたす。構造なので、それが非垞に䞻芳的であるこずがわかりたす。 12717の提案は、良い䞭間点だず思いたすそしお、既存のオブゞェクトリテラル型の安党性ずより䞀貫性がありたす。

https://github.com/Microsoft/TypeScript/issues/2103#issuecomment -145688774
これに察凊する前に、提案がステヌゞ3に到達するのを埅ちたいず思いたす。

すでに状態3のようですが、これをサポヌトする蚈画はありたすか

ずころで、VSCodeは䞻にES開発に䜿甚したすが、TSはただ䜿甚しおいたせん:)

@evisongこの機胜は出荷されおおり、vsCodeの最新バヌゞョンですでに利甚可胜です。 vsCodeをバヌゞョン1.8に曎新したす

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