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"]);
_ç·šéïŒã¿ã€ãã³ã°/éä¿¡ã®äŸãå°ãè¿œå ããŸãã_
ããããããããããŠã³ã¬ãã«ã§ã©ã®ããã«æŸåºãããå¯èœæ§ããããã«ã€ããŠã®ããã€ãã®äŸãå¿ èŠã«ãªãã§ãããïŒãããç¯å²å ã«ããå ŽåïŒã
@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åæå®ããå¿ èŠããããããçæ³çã§ã¯ãããŸãããããã以äžã®æ¹æ³ã¯èããããŸããã ã©ããªãã£ãŒãããã¯ã§ãæè¿ããŸããç§ãéãããšããžã®æ¯ãèãããããšç¢ºä¿¡ããŠããŸãïŒ
ããã¯ããããåãå ¥ãããã®ã§ããïŒ ïŒã¹ããŒãž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ãã¡ã€ã«ãšããŠãæžã蟌ãããšãã§ããŸãã
ããã¯ã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ã«æŽæ°ããŸã
æãåèã«ãªãã³ã¡ã³ã
æçµçã«ã©ã®ããã«åºè·ãããã¯ããããŸãããããªããžã§ã¯ããªãã©ã«ã®ã¬ã¹ã/ã¹ãã¬ãããšãã¹ãã©ã¯ãã£ãªã³ã°ã®äœæ¥ãéå§ããŸããã çŸåšã®èšç»ã§ã¯ãæåºã«
__assign
ããªãã£ã«ã䜿çšããäºå®ã§ãã