ååã§ãããã話ããŸããã æ§æã¯ããã§çµããã§ããæåŸã«ã楜ããéšåã«ç§»ããŸããããéçåã䜿çšããå©ç¹ã𿬠ç¹ãæ¢ããŸãã
å©ç¹ãã®1ïŒãã°ããšã©ãŒãäºåã«èŠã€ããããšãã§ããŸã
éçåãã§ãã¯ã«ãããããã°ã©ã ãèµ·åããããšãªããå®çŸ©ããäžå€åŒã
true
ã§ããããšã確èªã§ããŸãã ãŸãããããã®äžå€æ¡ä»¶ã«éåãããå Žåãããã°ã©ã ã®éå§åã«æ€åºãããæäœäžã«ã¯æ€åºãããŸããã
å°ããªäŸïŒååŸãåããé¢ç©ãèšç®ããå°ããªé¢æ°ããããšããŸãïŒ
const calculateArea = (radius) => 3.14 * radius * radius; var area = calculateArea(3);
ããŠãæ°å€ã§ã¯ãªã颿°ïŒãæ»æè
ããªã©ïŒã«ååŸãæž¡ãããå Žå...
var area = calculateArea('im evil');
NaN
ãè¿ããŸãã äœããã®æ©èœã
calculateArea
颿°ãåžžã«æ°å€ãè¿ããšããäºå®ã«åºã¥ããŠããå Žåãããã¯è匱æ§ãŸãã¯å€±æã«ã€ãªãããŸãã ããŸãè¯ããããŸããããïŒ
éçåã䜿çšããå Žåãæž¡ããããã©ã¡ãŒã¿ãŒã®ç¹å®ã®åãå®çŸ©ãããã®é¢æ°ã®å€ãè¿ããŸãã
const calculateArea = (radius: number): number => 3.14 * radius * radius;
次ã«ã
calculateArea
颿°ã®æ°ä»¥å€ã®å€ãæž¡ããŠã¿ãŸã-Flowã¯äŸ¿å©ã§çŽ æŽãããã¡ãã»ãŒãžãè¿ããŸãã
calculateArea('Im evil'); ^^^^^^^^^^^^^^^^^^^^^^^^^ function call calculateArea('Im evil'); ^^^^^^^^^ string. This type is incompatible with const calculateArea = (radius: number): number => 3.14 * radius * radius; ^^^^^^ number
ããã§ã颿°ã¯å
¥åã§æå¹ãªæ°åã®ã¿ãåãå
¥ããæå¹ãªæ°åã®åœ¢åŒã§ã®ã¿çµæãè¿ãããšãä¿èšŒãããŸãã
ã¿ã€ãã³ã³ãããŒã©ãŒã¯ãã³ãŒãã®äœææã«ãšã©ãŒãããã«éç¥ããã®ã§ãã³ãŒãã顧客ã«éä¿¡ãããåŸã«ãã°ãèŠã€ãããããã¯ããã«äŸ¿å©ã§ãïŒãããŠã¯ããã«å®äŸ¡ã§ãïŒã
ã¢ããã³ããŒãžNo. 2ïŒã©ã€ãããã¥ã¡ã³ãããããŸã
ã¿ã€ãã¯ãããªããšä»ã®äººã®äž¡æ¹ã®çãçããšããåŒåžã®ããã¥ã¡ã³ããšããŠæ©èœããŸãã
æ¹æ³ãçè§£ããããã«ãç§ããã€ãŠäœæ¥ãã倧ããªã³ãŒãããŒã¹ã§èŠã€ããã¡ãœãããèŠãŠã¿ãŸãããã
function calculatePayoutDate(quote, amount, paymentMethod) { let payoutDate; return payoutDate; }
äžèŠãããšïŒ2çªç®ãš3çªç®ã®äž¡æ¹ïŒããã®é¢æ°ã®äœ¿ç𿹿³ã¯å®å
šã«äžæã§ãã
åŒçšã¯æ°åã§ããïŒ ãŸãã¯ããŒã«å€ïŒ æ¯æãæ¹æ³ã¯ãªããžã§ã¯ãã§ããïŒ ãŸãã¯ãæ¯æãæ¹æ³ã®ã¿ã€ãã衚ãæååã«ããããšãã§ããŸããïŒ é¢æ°ã¯æåå圢åŒã§æ¥ä»ãè¿ããŸããïŒ ãŸãã¯ã
Date
ãªããžã§ã¯ãã§ããïŒ
æãããã¯ãããŸããã
ãã®ãšãããã¹ãŠã®ããžãã¹ããžãã¯ãè©äŸ¡ããããšã«ãããã¹ãŠãçè§£ãããŸã§ã³ãŒãããŒã¹ã§grepãå®è¡ããŸããã ããããããã¯åçŽãªé¢æ°ãã©ã®ããã«æ©èœããããçè§£ããããã ãã«å€ãã®äœæ¥ã§ãã
äžæ¹ã次ã®ãããªãã®ãæžããå ŽåïŒ
function calculatePayoutDate( quote: boolean, amount: number, paymentMethod: string): Date { let payoutDate; return payoutDate; }
颿°ãåãå
¥ããããŒã¿åãšè¿ãããåãããã«æããã«ãªããŸãã ããã¯ãéçåã䜿çšããŠã颿°
ãäœã
ããããšããŠããããäŒããæ¹æ³ã®äŸã§ãã ä»ã®éçºè
ã«ç§ãã¡ã圌ãã«æåŸ
ããããšãäŒããããšãã§ãã圌ããç§ãã¡ã«æåŸ
ãããã®ãèŠãããšãã§ããŸãã æ¬¡åã誰ãããã®æ©èœã䜿çšããå Žåã質åã¯ãããŸããã
ãã®åé¡ã¯ã³ãŒããŸãã¯ããã¥ã¡ã³ãã«ã³ã¡ã³ãã远å ããããšã§è§£æ±ºããããšäž»åŒµã§ããŸãã
function calculatePayoutDate(quote, amount, paymentMethod) { let payoutDate; return payoutDate; };
åäœããŸãã ãããããã£ãšããããã®èšèããããŸãã åé·æ§ã«å ããŠãã³ãŒãå
ã®ãã®ãããªã³ã¡ã³ãã¯ä¿¡é Œæ§ãäœããæ§é ããªããããç¶æããã®ãå°é£ã§ã-äžéšã®éçºè
ã¯è¯ãã³ã¡ã³ããæžããŸãããä»ã®éçºè
ã¯ãããã«ãããã®ãæžããã³ã¡ã³ããæ®ãã®ãå¿ããå ŽåããããŸãã
ãªãã¡ã¯ã¿ãªã³ã°åŸã«ã³ã¡ã³ããæŽæ°ããã®ãå¿ããã®ã¯ç¹ã«ç°¡åã§ãã äžæ¹ãåæ³šéã¯æç¢ºã«å®çŸ©ãããæ§æãšæ§é ãæã¡ãã³ãŒãèªäœã«ãšã³ã³ãŒããããŠãããããé³è
åããããšã¯ãããŸããã
ã¡ãªããïŒ3ïŒæ··ä¹±ãæããšã©ãŒåŠçãäžèŠ
åã¯ãæ··ä¹±ãæããšã©ãŒã®ã³ãŒãåŠçãæé€ããã®ã«åœ¹ç«ã¡ãŸãã
calculateArea
颿°ã«æ»ã£ãŠããããã©ã®ããã«çºçããããèŠãŠã¿ãŸãããã
ä»åã¯ãåååŸã®é¢ç©ãèšç®ããããã®ååŸã®é
åãåœŒå¥³ã«æž¡ããŸãã
const calculateAreas = (radii) => { var areas = []; for (let i = 0; i < radii.length; i++) { areas[i] = PI * (radii[i] * radii[i]); } return areas; };
ãã®é¢æ°ã¯æ©èœããŸãããç¡å¹ãªå
¥ååŒæ°ãæ£ããåŠçããŸããã å
¥ååŒæ°ãæå¹ãªæ°å€ã®é
åã§ãªãå Žåã«é¢æ°ãç¶æ³ãæ£ããåŠçããããšã確èªãããå Žåã¯ã次ã®åœ¢åŒã®é¢æ°ã«å°éããŸãã
const calculateAreas = (radii) => {
ãã ãã®ãããªå°ããªæ©èœã«ã¯å€ãã®ã³ãŒãããããŸãã
ãããŠéçåã§ã¯ã次ã®ããã«æžãã ãã§ãïŒ
const calculateAreas = (radii: Array<number>): Array<number> => { var areas = []; for (var i = 0; i < radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; };
ããã§ã颿°ã¯ãšã©ãŒåŠçã®ããã«èŠèŠçãªãŽãããã¹ãŠè¿œå ããåã®ããã«èŠããŸãã
éçåã®å©ç¹ãçè§£ããã®ã¯ç°¡åã§ãããïŒ
å©ç¹4ïŒèªä¿¡ãæã£ãŠãªãã¡ã¯ã¿ãªã³ã°ã§ãã
ããã人çã®ç©èªã§èª¬æããŸãã äžåºŠéåžžã«å€§ããªã³ãŒãããŒã¹ã
User
ãã
User
ã¯ã©ã¹ã«ã€ã³ã¹ããŒã«ãããã¡ãœãããæŽæ°ããå¿
èŠããããŸããã ç¹ã«ã颿°ãã©ã¡ãŒã¿ãŒã®1ã€ã
string
ãã
object
ã«å€æŽã
object
ã
倿Žãå ããŸããããã³ããããéä¿¡ããã®ãæãã£ãã§ã-ãã®é¢æ°ãžã®åŒã³åºããã³ãŒãå
šäœã«æ£ãã°ã£ãŠããã®ã§ããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãæ£ããæŽæ°ãããã©ããããããŸããã§ããã æ€èšŒãããŠããªãè£å©ãã¡ã€ã«ã®ã©ããã«ã³ãŒã«ãæ®ã£ãŠããå Žåã¯ã©ããªããŸããïŒ
確èªããå¯äžã®æ¹æ³ã¯ãã³ãŒããéä¿¡ãã倧éã®ãšã©ãŒã§ççºããªãããã«ç¥ãããšã§ãã
éçåã䜿çšããå Žåããã®åé¡ã¯çºçããŸããã ããã§ãå¿ã«å¹³ç©ãšéãããæããã§ãããã颿°ãšåã®å®çŸ©ãæŽæ°ãããšãåã³ã³ãããŒã©ãããã«ãããèŠéãå¯èœæ§ã®ãããã¹ãŠã®ãšã©ãŒãèŠã€ããããšãã§ããŸãã ãããã®ã¿ã€ããšã©ãŒãééããŠä¿®æ£ããã ãã§ãã
å©ç¹5ïŒããŒã¿ãšåäœã®åé¢
éçåã®ãã£ãã«èšåãããŠããªãå©ç¹ã®1ã€ã¯ãåäœããããŒã¿ãåé¢ããã®ã«åœ¹ç«ã€ããšã§ãã
ããäžåºŠãéçåã䜿çšãã
calculateArea
颿°ãèŠãŠã¿ãŸãããã
const calculateAreas = (radii: Array<number>): Array<number> => { var areas = []; for (var i = 0; i < radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; };
ãã®é¢æ°ãã©ã®ããã«ã³ã³ãã€ã«ããããèããŠãã ããã ããŒã¿åãæå®ãããããæž¡ããããã©ã¡ãŒã¿ãŒã®åãèšå®ããããã«å¿ããŠå€ãè¿ãããšãã§ããããã«ããŸã䜿çšããããŒã¿åã«ã€ããŠèããå¿
èŠããããŸãã

ãã®åŸã®ã¿ãããžãã¯ãå®è£
ããŸãã

æ¯ãèããšã¯å¥ã«ããŒã¿ãæ£ç¢ºã«è¡šçŸããæ©èœã«ãããä»®å®ãæç¢ºã«ç€ºããæå³ãããæ£ç¢ºã«äŒããããšãã§ããŸããããã«ãããç¹å®ã®ç²Ÿç¥çè² æ
ãåãé€ãããããã°ã©ããŒã«ç¹å®ã®æå¿«ããäžããããŸãã ãã以å€ã®å Žåã¯ãäœããã®æ¹æ³ã§ãã¹ãŠã念é ã«çœ®ããŠããå¿
èŠããããŸãã
ã¢ããã³ããŒãžçªå·6ïŒãã°ã®ã«ããŽãªãŒå
šäœã®æé€
ããã°ã©ã å®è¡äžã®åãšã©ãŒã¯ãJavaScriptéçºè
ãééããæãäžè¬çãªãšã©ãŒãŸãã¯ãã°ã®1ã€ã§ãã
ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã®åæç¶æ
ãæ¬¡ã®ããã«èšå®ãããŠãããšããŸãã
var appState = { isFetching: false, messages: [], };
次ã«ãAPIåŒã³åºããè¡ã£ãŠã¡ãã»ãŒãžã
appState
ã
appState
ãããšããŸãã ããã«ãã¢ããªã±ãŒã·ã§ã³ã«ã¯è¡šç€ºçšã®éåžžã«åçŽåãããã³ã³ããŒãã³ããããã
messages
ïŒäžèšã®ç¶æ
ã§è¡šç€ºïŒãååŸããæªèªã¡ãã»ãŒãžã®æ°ãšåã¡ãã»ãŒãžããªã¹ãã®èŠçŽ ãšããŠè¡šç€ºããŸãã
import Message from './Message'; const MyComponent = ({ messages }) => { return ( <div> <h1> You have { messages.length } unread messages </h1> { messages.map(message => <Message message={ message } /> )} </div> ); };
ã¡ãã»ãŒãžãåéããããã®APIåŒã³åºããæ©èœããªãã
undefined
è¿ããå Žåãæ¬çªç°å¢ã§ã¿ã€ããšã©ãŒãçºçããŸãã
TypeError: Cannot read property 'length' of undefined
...ããã°ã©ã ã¯å€±æããŸãã ããªãã¯é¡§å®¢ã倱ããŸãã ã«ãŒãã³ã
éçåãã©ã®ããã«åœ¹ç«ã€ããèŠãŠã¿ãŸãããã ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã«ãããŒã¿ã€ãã远å ããããšããå§ããŸãããã
AppState
åã®ãšã€ãªã¢ã¹ã䜿çšããŠç¶æ
ã倿ããŸãã
type AppState = { isFetching: boolean, messages: ?Array<string> }; var appState: AppState = { isFetching: false, messages: null, };
ã¡ãã»ãŒãžãååŸããããã®APIã確å®ã«æ©èœããªãããšãç¥ãããŠããããã
messages
ã®å€ã®æååé
åã«ç€ºãå Žåããã
messages
ã
ååãšåæ§ã«ãä¿¡é Œã§ããªãAPIãä»ããŠã¡ãã»ãŒãžãååŸãããã¥ãŒã³ã³ããŒãã³ãã§äœ¿çšããŸãã
import Message from './Message'; const MyComponent = ({ messages }) => { return ( <div> <h1> You have { messages.length } unread messages </h1> { messages.map(message => <Message message={ message } /> )} </div> ); };
ãããããã®æç¹ã§ãFlowã¯ãšã©ãŒãæ€åºããŠäžå¹³ãèšããŸãã
<h1> You have {messages.length} unread messages </h1> ^^^^^^ property `length`. Property cannot be accessed on possibly null value <h1> You have {messages.length} unread messages </h1> ^^^^^^^^ null <h1> You have {messages.length} unread messages </h1> ^^^^^^ property `length`. Property cannot be accessed on possibly undefined value <h1> You have {messages.length} unread messages </h1> ^^^^^^^^ undefined { messages.map(message => <Message message={ message } /> )} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ call of method `map`. Method cannot be called on possibly null value { messages.map(message => <Message message={ message } /> )} ^^^^^^^^ null { messages.map(message => <Message message={ message } /> )} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ call of method `map`. Method cannot be called on possibly undefined value { messages.map(message => <Message message={ message } /> )} ^^^^^^^^ undefined
åŸ
ã£ãŠïŒ
messages
ã
maybe
ãšããŠå®çŸ©ããã®ã§ã
messages
ã
null
ãŸãã¯
undefined
ãŸãã ãã ããããã¯ã
messages
ã®å€ãå®éã«
null
ãŸãã¯
undefined
ã§ããå Žåãæäœãå®è¡ããããšãããšåãšã©ãŒããããã¢ããããããã
null
ããã§ãã¯ããã«æäœïŒ
.length
ã
.map
ïŒãå®è¡ããæš©å©ãäžããŸããã
æ»ã£ãŠé¢æ°ãæŽæ°ããæ¬¡ã®ãããªãã®ã衚瀺ããŸãããã
const MyComponent = ({ messages, isFetching }: AppState) => { if (isFetching) { return <div> Loading... </div> } else if (messages === null || messages === undefined) { return <div> Failed to load messages. Try again. </div> } else { return ( <div> <h1> You have { messages.length } unread messages </h1> { messages.map(message => <Message message={ message } /> )} </div> ); } };
ããã§ãFlowã¯ã
messages
ã
null
ãŸãã¯
undefined
ã§ãããã¹ãŠã®ç¶æ³ãèæ
®ããããšãèªèããŠãããããã³ãŒãã¿ã€ããã§ãã¯ã¯ãšã©ãŒ0ã§å€±æããŸãã ããããªããããã°ã©ã å®è¡äžã®ãšã©ãŒïŒ
ã¡ãªããïŒ7ïŒåäœãã¹ãã®åæž
éçåã¯ã颿°ãšæ»ãå€ã«æž¡ããããã©ã¡ãŒã¿ãŒã®åãä¿èšŒãããããè§£æããããšã©ãŒãåãé€ãã®ã«ã©ã®ããã«åœ¹ç«ã€ããèŠãŠããŸããã ãã®çµæãéçåã¯åäœãã¹ãã®æ°ãæžãããŸãã
ããšãã°ãåçåãšãšã©ãŒåŠçãåãã
calculateAreas
颿°ã«æ»ããŸãã
const calculateAreas = (radii) => {
å€åãªããã°ã©ããŒã§ããã°ãç¡å¹ãªãã©ã¡ãŒã¿ãŒããã¹ãããŠãããã°ã©ã ã«ãã£ãŠæ£ããåŠçãããŠããããšã確èªããããšãæ€èšã§ããŸãã
it('should not work - case 1', () => { expect(() => calculateAreas([null, 1.2])).to.throw(Error); }); it('should not work - case 2', () => { expect(() => calculateAreas(undefined).to.throw(Error); }); it('should not work - case 2', () => { expect(() => calculateAreas('hello')).to.throw(Error); });
...ãªã©ã ããããããã€ãã®å¢çã±ãŒã¹ããã¹ãããããšãå¿ããå¯èœæ§ãéåžžã«é«ããåé¡ãèŠã€ããã®ã¯ã客æ§ã§ãã :(
ãã¹ãã¯ããã¹ãããããã«æãã€ããç¶æ³ã«ã®ã¿åºã¥ããŠãããããå®åçã§ãããå®éã«ã¯ç°¡åã«åé¿ã§ããŸãã
äžæ¹ãã¿ã€ããèšå®ããå¿
èŠãããå ŽåïŒ
const calculateAreas = (radii: Array<number>): Array<number> => { var areas = []; for (var i = 0; i < radii.length; i++) { areas[i] = 3.14 * (radii[i] * radii[i]); } return areas; };
...ç§ãã¡ã¯ç®æšãçå®ã§ãããšããä¿èšŒãåŸãã ãã§ãªãããã®ãããªãã¹ãã¯åã«ããä¿¡é Œã§ãããã®ã§ãã çµéšçãã¹ããšã¯ç°ãªããåã¯æ®éçã§ãããåé¿ãå°é£ã§ãã
äžè¬çã«ãå³ã¯æ¬¡ã®ãšããã§ãããã¹ãã¯ããžãã¯ã®ãã§ãã¯ã«é©ããã¿ã€ãã¯ããŒã¿åã®ãã§ãã¯ã«é©ããŠããŸãã ããããçµã¿åããããšãéšåã®åèšãããã«å€§ããªå¹æããããããŸãã
ã¡ãªããïŒ8ïŒãã¡ã€ã³ã¢ããªã³ã°ããŒã«
éçåã䜿çšããç§ã®ãæ°ã«å
¥ãã®äŸã®1ã€ã¯ããã¡ã€ã³ã¢ããªã³ã°ã§ãã ãã®å ŽåãããŒã¿ãšãã®ããŒã¿ã«å¯Ÿããããã°ã©ã ã®åäœã®äž¡æ¹ãå«ãã¢ãã«ãäœæãããŸãã ãã®å Žåãåã®äœ¿ç𿹿³ã®äŸãçè§£ããããšãæåã§ãã
ã¢ããªã±ãŒã·ã§ã³ã§ããã©ãããã©ãŒã ã§è³Œå
¥ããããã®1ã€ä»¥äžã®æ¯æãæ¹æ³ããŠãŒã¶ãŒã«æäŸãããŠãããšããŸãã ãŠãŒã¶ãŒã¯ã3ã€ã®æ¯æãæ¹æ³ïŒPaypalãã¯ã¬ãžããã«ãŒããéè¡å£åº§ïŒããéžæã§ããŸãã
ãã®ãããæåã«3ã€ã®æ¯æãæ¹æ³ã«åãšã€ãªã¢ã¹ãé©çšããŸãã
type Paypal = { id: number, type: 'Paypal' }; type CreditCard = { id: number, type: 'CreditCard' }; type Bank = { id: number, type: 'Bank' };
ããã§ã
PaymentMethod
ã¿ã€ããã3ã€ã®ã±ãŒã¹ãæã€
PaymentMethod
éåãšããŠèšå®ã§ããŸãã
type PaymentMethod = Paypal | CreditCard | Bank;
次ã«ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã®ã¢ãã«ãäœæããŸãããã è€éã«ãªããªãããã«ããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒãå©çšã§ããæ¯æãæ¹æ³ã®ã¿ã§æ§æãããŠãããšä»®å®ããŸãã
type Model = { paymentMethods: Array<PaymentMethod> };
ããã¯åãå
¥ããããŸããïŒ ãŠãŒã¶ãŒã®æ¯æãæ¹æ³ãåãåãã«ã¯ãAPIã«ãªã¯ãšã¹ããéä¿¡ããå¿
èŠããããŸããããã»ã¹ã®çµæã𿮵éã«å¿ããŠãã¢ããªã±ãŒã·ã§ã³ã¯ç°ãªãç¶æ
ããšãããšããããŸãã å®éã«ã¯ã次ã®4ã€ã®ç¶æ
ãå¯èœã§ãã
1ïŒæ¯æãæ¹æ³ãåãåããŸããã§ããã
2ïŒæ¯æãæ¹æ³ãåãåãåŠçäžã§ãã
3ïŒãæ¯æãæ¹æ³ãåãåããŸããã
4ïŒæ¯æãæ¹æ³ãååŸããããšããŸãããããšã©ãŒãçºçããŸããã
ãããã
paymentMethods
ããåçŽãª
Model
ã¿ã€ãã¯ããããã®ãã¹ãŠã®ã±ãŒã¹ãã«ããŒããŠãã
paymentMethods
ã¯ãããŸããã 代ããã«ã
paymentMethods
åžžã«ååšãããšæ³å®ããŠããŸãã
ããŒã ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ããããã®4ã€ã®å€ã®ãããã1ã€ã ããåãããã«ã¢ãã«ãæ§ç¯ããæ¹æ³ã¯ãããŸããïŒ èŠãŠã¿ãŸãããïŒ
type AppState<E, D> = { type: 'NotFetched' } | { type: 'Fetching' } | { type: 'Failure', error: E } | { type: 'Success', paymentMethods: Array<D> };
AppState
ãäžèšã®4ã€ã®ç¶æ
ã®ããããã«èšå®ããããã«ãäºãã«çŽ ãªã»ããã¿ã€ãã䜿çšããŸããã
type
ããããã£ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã4ã€ã®ç¶æ
ã®ã©ãã«ãããã倿ããæ¹æ³ã«æ³šç®ããŠãã ããã ã°ãã°ãã®ã»ãããäœæããã®ã¯ãã®
type
ããããã£ã§ãã ããã䜿çšããŠãæ¯æãæ¹æ³ãããå Žåãšãªãå ŽåãåæããŠå€æã§ããŸãã
ãŸãããã©ã¡ãŒã¿ãŒåãããã¿ã€ã
E
ããã³
D
ãã¢ããªã±ãŒã·ã§ã³ç¶æ
ã«æž¡ãããšã«ãæ°ä»ãã§ãããã ã¿ã€ã
D
ã¯ããŠãŒã¶ãŒã®æ¯æãæ¹æ³ïŒäžèšã§å®çŸ©ãã
PaymentMethod
ïŒã«ãªããŸãã ãšã©ãŒã®ã¿ã€ããšãªãã¿ã€ã
E
èšå®ããŠããªããããããã§ãããå®è¡ããŸãããã
type HttpError = { id: string, message: string };
ããã§ãã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã³ãã·ãã¥ã¬ãŒãã§ããŸãã
type Model = AppState<HttpError, PaymentMethod>;
äžè¬ã«ãã¢ããªã±ãŒã·ã§ã³ç¶æ
ã®çœ²åã¯
AppState<E, D>
ã«ãªããŸãããããã§ã
E
ã¯
HttpError
ã®åœ¢åŒã§ã
D
ã¯
PaymentMethod
ã§ãã ãŸãã
AppState
ã¯ã
NotFetched
ã
Fetching
ã
Failure
Success
4ã€ã®ç¶æ
ïŒããã4ã€ã®ã¿ïŒããããŸãã

ãã®ãããªãã¡ã€ã³ã¢ãã«ã¯ãç¹å®ã®ããžãã¹ã«ãŒã«ã«åŸã£ãŠãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãèããéçºããã®ã«åœ¹ç«ã¡ãŸãã ããžãã¹ã«ãŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯ãããã®ç¶æ
ã®ãããã1ã€ã«ãããªããªãããšã瀺ããŠãããããã«ããAppStateãæç€ºçã«è¡šãããããã®å®çŸ©æžã¿ã®ç¶æ
ã®1ã€ã«ã®ã¿ãªãããšãä¿èšŒã§ããŸãã ãããŠããã®ã¢ãã«ã«åŸã£ãŠéçºããå ŽåïŒããšãã°ã衚瀺çšã®ã³ã³ããŒãã³ããäœæããå ŽåïŒã4ã€ã®å¯èœãªç¶æ
ãã¹ãŠãåŠçããå¿
èŠãããããšãæããã«ãªããŸãã
ããã«ãã³ãŒãã¯ããèªäœãææžåããŸã-äºãã«çŽ ãªã»ãããèŠãã ãã§ãAppStateãã©ã®ããã«æ§æãããŠããããããã«ããããŸãã
éçåã䜿çšããå Žåã®æ¬ ç¹
çæŽ»ãããã°ã©ãã³ã°ã®ä»ã®ãã¹ãŠãšåæ§ã«ãéçåã®ãã§ãã¯ã«ã¯ããã€ãã®åŠ¥åãå¿
èŠã§ãã
ãããã®æ¬ ç¹ãçè§£ããèªèããããšã¯éèŠã§ããéçåã䜿çšããããšãçã«ããªã£ãŠããå Žåãããã³åã«äŸ¡å€ããªãå Žåã«ãååãªæ
å ±ã«åºã¥ããæ±ºå®ãäžããããã«ããããã§ãã
ãããã®èæ
®äºé
ã®äžéšã次ã«ç€ºããŸãã
æ¬ é¥ïŒ1ïŒéçåã«ã¯äºåã®èª¿æ»ãå¿
èŠ
JavaScriptãåå¿è
ã«ãšã£ãŠãšãŠãçŽ æŽãããèšèªã§ããçç±ã®1ã€ã¯ãåå¿è
ãçç£çãªäœæ¥ãå§ããåã«å®å
šãªåã·ã¹ãã ãåŠã¶å¿
èŠããªãããšã§ãã
ç§ãåããŠElmïŒéçåä»ããåãã颿°åèšèªïŒãåŠãã ãšããåã¯ãã°ãã°éªéã«ãªããŸããã åå®çŸ©ãåå ã§ã³ã³ãã€ã©ãšã©ãŒãåžžã«çºçããŸããã
åã®å¹æçãªäœ¿çšãåŠã¶ããšã¯ãèšèªèªäœãåŠã¶ããšã«æåããååã§ããã ãã®çµæãéçåã®ãããElmã®åŠç¿æ²ç·ã¯JavaScriptãããæ¥ã§ãã
ããã¯ãæ§æãåŠç¿ããããšã§èªç¥çè² è·ãæã倧ããåå¿è
ã«ãšã£ãŠç¹ã«éèŠã§ãã ãã®ã»ããã«æ§æã远å ãããšãåå¿è
ãå§åããå¯èœæ§ããããŸãã
æ¬ é¥ïŒ2ïŒåé·æ§ã«å·»ã蟌ãŸãã
éçåã®ãããããã°ã©ã ã¯ããåé·ã§æ··ä¹±ããŠããããã«èŠããããšããããããŸãã
ããšãã°ã代ããã«ïŒ
async function amountExceedsPurchaseLimit(amount, getPurchaseLimit){ var limit = await getPurchaseLimit(); return limit > amount; }
æžããªããã°ãªããŸããïŒ
async function amountExceedsPurchaseLimit( amount: number, getPurchaseLimit: () => Promise<number> ): Promise<boolean> { var limit = await getPurchaseLimit(); return limit > amount; }
ãããŠä»£ããã«ïŒ
var user = { id: 123456, name: 'Preethi', city: 'San Francisco', };
ç§ã¯ãããæžããªããã°ãªããŸããïŒ
type User = { id: number, name: string, city: string, }; var user: User = { id: 123456, name: 'Preethi', city: 'San Francisco', };
æããã«ãäœåãªã³ãŒãè¡ã远å ãããŸãã ãããããããæ¬ é¥ãšèŠãªãããšã«å察ããè°è«ãããã€ããããŸãã
ãŸããåè¿°ããããã«ãéçåã¯ãã¹ãã®ã«ããŽãªå
šäœãç Žå£ããŸãã äžéšã®éçºè
ã¯ããããå®å
šã«åççãªåХ忡ã§ãããšæãããããããŸããã
第äºã«ãå
ã»ã©èŠãããã«ãéçåã¯è€éãªãšã©ãŒãåŠçããå¿
èŠæ§ãæé€ã§ããå Žåããããããã«ããã³ãŒãã®æ··ä¹±ã倧å¹
ã«åæžãããŸãã
åé·æ§ãåã«å¯Ÿããçã®è°è«ã§ãããã©ãããèšãã®ã¯é£ããã§ãããèŠããŠãã䟡å€ã¯ãããŸãã
æ¬ é¥3ïŒåã®äœ¿çšãç¿åŸããã«ã¯æéãããã
ããã°ã©ã ã§æé©ãªã¿ã€ããéžæããæ¹æ³ãåŠã¶ã«ã¯ãå€ãã®æéãšç·Žç¿ãå¿
èŠã§ãã
ããã«ãéçã«ç£èŠããå¿
èŠããããã®ãããã³åçãªåœ¢ã§æ®ãæ¹ãè¯ããã®ãé©åã«éçºããã«ã¯ãæ£ç¢ºãªã¢ãããŒããå®è·µãããã³çµéšãå¿
èŠã§ããããšãã°ã1ã€ã®ã¢ãããŒãã¯ãéèŠãªããžãã¹ããžãã¯ãéçåã§ãšã³ã³ãŒãããŸãããäžå¿
èŠãªè€éããåé¿ããããã«ãçæãŸãã¯éèŠã§ãªãããžãã¯ãåçãªãŸãŸã«ããŸããç¹ã«çµéšã®æµ
ãéçºè
ããã®å Žã§æ±ºå®ãäžããªããã°ãªããªãå Žåãéããçè§£ããããšã¯å°é£ã§ããæ¬ é¥4ïŒéçãªåã¯é«ééçºãé
ãããå¯èœæ§ããã
åã«è¿°ã¹ãããã«ãç§ã¯Elmãå匷ãããšããç¹ã«ã³ãŒãã远å ããã倿Žããããããšãã«ãåã«ã€ããŠå°ãã€ãŸãããŸãããã³ã³ãã€ã©ãŒã®ãšã©ãŒã«åžžã«æ°ãåãããŠãäœæ¥ãè¡ã£ãŠé²æãæããããšã¯å°é£ã§ããããã§ã®è°è«ã¯ãéçåããã§ãã¯ããããã«ãããã°ã©ããŒãéäžåã倱ããããããšããããšããããšã§ã-ãããŠãããªããç¥ã£ãŠããããã«ãéäžåã¯è¯ãããã°ã©ã ãæžãããã®éèŠãªèŠçŽ ã§ãããããå¯äžã®ãã€ã³ãã§ã¯ãããŸãããéçã¿ã€ãã®ã³ã³ãããŒã©ãŒãåžžã«çæ³çã§ã¯ãããŸãããäœããã¹ãããç¥ã£ãŠãããšãã«ç¶æ³ãçºçããã¿ã€ããã§ãã¯ãå¹²æžããããšããããŸããç§ã¯ä»ã®ããã€ãã®æ¬ ç¹ãéãããšç¢ºä¿¡ããŠããŸããããããã¯ç§ã«ãšã£ãŠæãéèŠã§ããJavaScriptã§éçåã䜿çšããå¿
èŠããããŸããïŒ
ç§ãæåã«åŠãã ããã°ã©ãã³ã°èšèªã¯JavaScriptãšPythonã§ãããã©ã¡ããåçåä»ããåããèšèªã§ããããããéçåããã¹ã¿ãŒãããšãããã°ã©ãã³ã°ã«ã€ããŠã®èãæ¹ã«æ°ããæ¬¡å
ã远å ãããŸãããããšãã°ãæåã¯Elmã®ã³ã³ãã€ã©ãšã©ãŒã®çµ¶ãéãªãå ±åãå§åçã§ãããã忀åºãšãã³ã³ãã€ã©ã«æºè¶³ãã2çªç®ã®æ§è³ªã«ãªããå®éã«ããã°ã©ãã³ã°ã¹ãã«ãåäžããŸãããããã«ãç§ãäœãééã£ãããšãããŠããŠããã®ä¿®æ£æ¹æ³ãæããŠãããã¹ããŒãããããã»ã©è§£æŸçãªãã®ã¯ãããŸãããã¯ããé床ã®åé·æ§ããããã®ç ç©¶ã«æéãè²»ããå¿
èŠæ§ãªã©ãéçåã®é¿ããããªã劥åããããŸããããããåã¯ããã°ã©ã ã«ã»ãã¥ãªãã£ãšæ£ç¢ºãã远å ããå人çã«ãããã®ãæ¬ ç¹ãã®éèŠæ§ãæé€ããŸããåçã¿ã€ãã¯ããé«éã§åçŽã«èŠããŸãããå®éã«ããã°ã©ã ãå®è¡ãããšå€±æããå¯èœæ§ããããŸããåæã«ãããè€éãªãã©ã¡ãŒã¿ãŒåãããåãæ±ãJavaéçºè
ãšè©±ãããšãã§ããŸããæçµçã«ãæ®éçãªè§£æ±ºçã¯ãããŸãããå人çã«ã¯ãæ¬¡ã®æ¡ä»¶äžã§éçåã䜿çšããããšã奜ã¿ãŸãã- ãã®ããã°ã©ã ã¯ããªãã®ããžãã¹ã«ãšã£ãŠéèŠã§ãã
- ãã®ããã°ã©ã ã¯ãæ°ããããŒãºã«åãããŠãªãã¡ã¯ã¿ãªã³ã°ãããå¯èœæ§ããããŸãã
- ããã°ã©ã ã¯è€éã§ãå€ãã®å¯åéšåããããŸãã
- ãã®ããã°ã©ã ã¯ãã³ãŒããè¿
éãã€æ£ç¢ºã«çè§£ããå¿
èŠããã倿°ã®éçºè
ã°ã«ãŒãã«ãã£ãŠãµããŒããããŠããŸãã
äžæ¹ãæ¬¡ã®æ¡ä»¶ã§ã¯éçåãæåŠããŸãã- ã³ãŒãã¯çåœã§ãããéèŠã§ã¯ãããŸããã
- ãããã¿ã€ããäœæããã§ããã ãæ©ãé²ããããšããŸãã
- ããã°ã©ã ã¯å°ãããã·ã³ãã«ã§ãã
- ããªãã ããéçºè
ã§ãã
æè¿ã®JavaScriptéçºã®å©ç¹ã¯ãFlowãTypeScriptãªã©ã®ããŒã«ã®ãããã§ãæçµçã«éçåãŸãã¯å€ãè¯ãJavaScriptã䜿çšããéžæãã§ããããšã§ãããããã«
ãããã®èšäºããåã®éèŠæ§ããããã®äœ¿ç𿹿³ããããŠæãéèŠãªã®ã¯*ãã€*ãããã䜿çšããããçè§£ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸããåçåãšéçåãåãæ¿ããæ©èœã¯ãJavaScriptã³ãã¥ããã£ã«ãšã£ãŠåŒ·åãªããŒã«ã§ããããšããµã€ãã£ã³ã°ã§ã:)
èè
ã«ã€ããŠïŒã«ãªãã©ã«ãã¢å·ãµããšã³AIã®å
±åèšç«è
å
ŒãªãŒããšã³ãžãã¢ã§ããPreethi Kasireddy