์ด๋ฆฐ ์ง๋ฌธ
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์ผ ํธ์ง: ์ด ์ ์์ "๋ ์ ํ" ์ฐ์ฐ์๋ผ๊ณ ๋ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
x && xy && xyz && xyzfoo
ํ์ง๋ง ๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ๋ x, y, z, foo๊ฐ ๊ฐ๊ฐ ์ต๋ ํ ๋ฒ๋ง ํ๊ฐ๋๋๋ก ํด์ผ ํฉ๋๋ค.
๋น์ ์ ๋ํ ๋ง์ ๊ฒฝ์ฐ์ &&
๋ฅผ ํ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ์ง์ค์ฑ์ ํ๋ฆฌ๋ฏธํฐ๋ธ์๊ฒ ์ฝ๊ฐ์ ๋ฌธ์ ๊ฐ ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
์๋ฅผ ๋ค์ด:
" "?.trim()?.indexOf("hello")
""
๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฐ๋ผ์ ์ ํ ์์คํ
์ ํ์ฉํ์ง ์๋ ํ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ==
๋ฅผ ์ฌ์ฉํ์ฌ $ null
์ ๋ํ ๋ช
์์ ๋น๊ต๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
monadic-bind ํจ์(JS ์ถ๋ ฅ์ ์ ํฉํ์ง ์์)๋ฅผ ๋ด๋ณด๋ด๊ฑฐ๋ ์ผํญ ์ฐ์ฐ์์ ๋ํ ์ผ๋ถ ๋ณํ(์ผ๋ฐ์ ์ธ JS์ ๋ ๊ฐ๊น์)์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ ๋ถ๋ช ํ ํ์์ ์ฝ๊ฐ ํธํฅ๋์ด ์๋ค.
esdiscuss์์ ์ด์ ๋ํ ๋ ผ์๊ฐ ๊ฑฐ์ ์์์ต๋๋ค.
:+1:
์ด์์ ์ผ๋ก๋ ์ค์ ๋ก 0
/ ""
๋ฅผ ์ฌ์ฉํ ์ง ์ฌ๋ถ์ ๋ํ ์ ํํ ์๋ฏธ์ ๋ํด ์ฝ๊ฐ์ ๋ถ์ผ์น๊ฐ ์์ ์ ์์ผ๋ฏ๋ก ES7(๋๋ ES8 ๋๋ ES9 ๋๋ ...)์ด ์ด๋ฅผ ๋จผ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
:+1: TypeScript๊ฐ ESxx๋ฅผ ๊ธฐ๋ค๋ฆด ํ์ ์์ด ๋จผ์ ์ด๊ฒ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
"?"์ ๊ฐ์ ๊ฐ๋จํ๊ณ ๋ฏธ์น๋ฏ์ด ์ ์ฉํ null-safety ์ฐ์ฐ์๋ ๊ทธ๋ฆฌ๊ณ "?:"๊ฐ ES6 ์ฌ์์ ์๋ค๋ ๊ฒ์ ES6 ์ฌ์์ ๊ตฌ์ฑํ๋ ์ฌ๋๋ค์ด ๋ถ๋๋ฌ์์ ๊ณ ๊ฐ๋ฅผ ์์ฌ์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ ํตํฉํ์ง ์๋ ๊ฒ์ด ์์งํ ๋ฏธ์น ๊ฒ์ด ๋ ์ ๋๋ก ๊ฐ๋จํ๊ณ ๋ช ๋ฐฑํ ๊ฒ์ ๋๋ค. ๋๋ถ๋ถ์ ํ๋ ์ธ์ด๊ฐ ์ด๋ฅผ ์ง์ํ๋ ๋ฐ๋ ์ด์ ๊ฐ ์์ต๋๋ค. ํ์ ๋ถ๊ฐ๊ฒฐํ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ด ํ์ฌ ์ฌ์์์ ๋ฒ์ด๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค(ํ์ฌ ์ฌ์์ ์ด๊ฒ์ ์๋ตํ ์ ๋๋ก ๊ทผ์์์ ์ด๊ธฐ ๋๋ฌธ์). ๊ทธ๋ฌ๋ ์ด ๋จ์ผ ํธ์ฐจ๊ฐ ์ ๋นํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ๋๋ฌด ํฐ๋ฌด๋์์ด ์ ์ฉํฉ๋๋ค. ๊ด๋ํ(VAST) ๋๋ค์์ TS ๊ฐ๋ฐ์๋ ๊ตฌํ์ ๋ํ ์ฌ์ํ ๋ณ๊ฒฝ์ด ์ต์ข ์ ์ผ๋ก ES ์ฌ์์ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์ ๊ณตํ๋ ์์ฒญ๋ ์ด์ ์ ์์์ ๊ฐ๋ฐ์์๊ฒ ์ ์ฌ์ ์ธ ๋ฏธ๋ ์ํฅ์ ์ค ๊ฐ์น๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฒญ๋๊ฒ ๋๋ฆฐ ES ์ฌ์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํ ๋ ์ด๊ฒ์ ๋ช ๋ ๋์(์ต์ํ) ์ ํ ๋ฌธ์ ๊ฐ ๋์ง ์์ ๊ฒ์ ๋๋ค.
๋๋ brain428์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
@brian428 ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ํด๋น ์ฐ์ฐ์๊ฐ ES7์์ ๊ตฌํ๋ ์ ์์ผ๋ฏ๋ก typescript๊ฐ ์ต์ข ES7๊ณผ ๋ค๋ฅธ ์ฌ์์ ์ฌ์ฉํ๋ค๋ฉด ์๋ฌด๋ ๋ง์กฑํ์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ๊ทธ ์ฐ์ฐ์๊ฐ ES7์์ ๊ตฌํ๋ ์ ์์ผ๋ฏ๋ก typescript๊ฐ ์ต์ข ES7๊ณผ ๋ค๋ฅธ ์ฌ์์ผ๋ก ๊ฐ๋ค๋ฉด ์๋ฌด๋ ๋ง์กฑํ์ง ์์ ๊ฒ์ ๋๋ค.
TypeScript๊ฐ ES ๋ฐฉํฅ์ ์ํฅ์ ๋ฏธ์น๋ ์ ์ฉํ ํ ์คํธ๋ฒ ๋๊ฐ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ _์ ์ฌ์ ์ผ๋ก _(๋๋ ๊ทธ๋ ์ง ์์ ์๋ ์๋) ํฅํ ES ๋ฒ์ ์ผ๋ก ๋ง๋ค ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ด TypeScript ์ ๋ํด ๋ณด๋ค ๊ธ์ ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ค์์ TypeScript์ ์ํฅ์ ๋ฐ๋ ES ํ ๋ก ์ ์์ ๋๋ค.
TypeScript... ์์ฑ์์ ๋งค๊ฐ๋ณ์ ์ค ํ๋์์ private ์ ๋์ฌ๋ฅผ ํตํด ์ ์ธํ๊ณ ์ด๊ธฐํํ๋ ์ต์ ์ ๋ง์ ๊ฐ๋ฐ์์๊ฒ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ํ ES๊ฐ ์ด๋ฏธ TypeScript์ ์์ง๋ง ์๋ฏธ ์ฒด๊ณ๊ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ(์: ๋ชจ๋ ์๋ ๋ฐฉ์)์ ์ฑํํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
ES๊ฐ TypeScript์ ์ด๋ฏธ ์กด์ฌํ์ง๋ง ์๋ฏธ ์ฒด๊ณ๊ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ฑํํ๋ ๊ฒ์ ํ์คํ ๊ฐ๋ฅํฉ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์ต์ ์ ์๋๋ฆฌ์ค๋ก ๊ด๋ฒ์ํ๊ฒ ๊ณ ๋ คํ๋ค๋ ์ ์ ์ฃผ๋ชฉํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ TypeScript 1.0์ ์ ์ธํ๊ธฐ ์ ์ ES6์ ๋ชจ๋์ด ์์ฑ๋๊ธฐ๋ฅผ ์ ๋ง๋ก ์ํ์ง๋ง ์์ํ์ ์ผ์ ์ง์ฐ์ผ๋ก ์ธํด ๊ทธ๊ฒ์ ๋ง์์ต๋๋ค. ์ด๊ฒ์ ๋ฐ๋ณต๋๋ ๊ฒ์ด ์๋๋ผ ํผํด์ผ ํ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ES7+๋ก ๋ง๋ค ํ๋ฅ ์ด 0% ์ดํ์ด๊ฑฐ๋(์: ์ ํ ์ฃผ์) ์ฝ๊ฒ ์ ์๋ ์๋ฏธ ์ฒด๊ณ๋ก ๋ง๋ค ๊ฐ๋ฅ์ฑ์ด ~100%์ธ ๊ธฐ๋ฅ(์: ๋ฑ๋ฑํ ํ์ดํ๊ฐ 2์ธ ๊ฒฝ์ฐ)์ ์น๊ณ ์ถ์ต๋๋ค. ์ฌ๋ฌ ํด ์ ์). ์๋ก์ด ์ด์์๋ ์ด์ํ ์ค๊ฐ์ ๋น ์ง ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ต์ ์ ๊ฒฝ์ฐ 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 ํ์ผ, ํนํ space-pen๊ณผ ๊ฐ์ด DOM๊ณผ ์ง์ ์๋ํ๋ ํ์ผ(๋ณด๊ธฐ๊ฐ ํ๊ดด๋ ํ ๋๋ ๋ณด๊ธฐ๊ฐ ์ฒจ๋ถ๋๊ธฐ ์ ์ ํจ์๊ฐ ์คํ๋ ์ ์๋ ๊ณณ)์ ์ด๋ฉด ์์ฒญ๋ ?
์ฌ์ฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด ํ์ผ์๋ 16
https://github.com/atom-community/autocomplete-plus/blob/f17659ad4fecbd69855dfaf00c11856572ad26e7/lib/suggestion-list-element.coffee ๊ฐ ์์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง ๋๋ ์ด๊ฒ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ข์ํ์ง ์์ง๋ง JavaScript์ ์ํ์ด๋ฉฐ ๋ฐฑ๋ง if( && fest ) { then }
๋ณด๋ค๋ ?
๋ฅผ ์ ํธํฉ๋๋ค.
ํ์ง๋ง ๋ด ์ฝ๋๋ฅผ ์ฝ์ ์ ์๋๋ก ์ ์งํ๋ ค๋ฉด ์ ๋ง ํ์ํฉ๋๋ค. XHR์ด ์๋ฃ๋๊ณ Angular๊ฐ ๋ค์ด์ ์คํธ ๋ฃจํ๋ฅผ ์คํํ ๋๊น์ง ์ด๋ฅผ _ํ์๋ก ํ๋ ๊ฒฝ์ฐ์๋ ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค.
์ด์ ์ค๋ ๋๋ฅผ ์ฝ๊ณ ์ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ค๋ฆฌ๋์ง ์ ์ ์์ต๋๋ค. ์ดํดํฉ๋๋ค _ํ์จ_.
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;
(๋๋ typescript์ ๋ํด undefined
๊ฒ์ฌ๊ฐ ๋ถํ์ํ๋ค๊ณ ๊ฐ๋ ฅํ๊ฒ ์๊ฐํฉ๋๋ค. var
init typecheck๊ฐ typescript์ ์ํด ๊ฒ์ฌ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค)
+1
์ค๋ ๋ด์ค์์ Dart๋ ์ด์ ๋ํ ๊ณต์ ์ง์์ ๋ฐ๊ณ ์์ต๋๋ค: 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
๊ฐ์ ๋ฐํํ๋ฉด ๋ชจ๋ props๊ฐ ์กด์ฌํ๊ณ ๊ทธ๊ฒ์ด ํจ์์ธ ๊ฒฝ์ฐ์๋
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์ ๋ฐํํฉ๋๋ค. ์๋ฃจ์ ์ ๋น ๋ฌธ์์ด ๋ฐ 0๊ณผ ๊ฐ์ ์๋ชป๋ ๊ฐ์ ์์ฑ์ ์กฐํํ์ง ๋ชปํฉ๋๋ค.
@metaweta : ๊ทธ๋ ์ง ์์ต๋๋ค: http://jsfiddle.net/25LppbL6/
๋ํ ์ผ๋ถ ์ฌ๋๋ค์ ๋ฆฐํฐ๊ฐ ์ด์ ๋ํด ๊ฒฝ๊ณ ํ๋ค๋ ์ฌ์ค ๋๋ฌธ์ TS ํ์ด ๋์จํ ํ๋ฑ์ ์ฌ์ฉํ๋ ๋ฐ ์ด๊ดํ์ง ์๋๋ค๊ณ ์์ํ ์ ์์ต๋๋ค.
@Back-io ๊ทธ๋ ์ต๋๋ค: http://jsfiddle.net/25LppbL6/2/
@Back-io null๊ณผ ๊ด๋ จํ์ฌ?.b์ ์๋๋ ์๋ฏธ๊ฐ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. "์์ฑ b๊ฐ ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ"์ด๋ฉด ๋ด ์ฝ๋๊ฐ ๊ฑฐ์ ์ ํํฉ๋๋ค. ์กด์ฌํ์ง ์๋ ์์ฑ์ ์กฐํํ๋ฉด ์ ์๋์ง ์์ ๊ฐ์ด ๋ฐํ๋๊ธฐ ๋๋ฌธ์ null์ ์ป์ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ null๋ก ํ ๋น๋ ๊ฒฝ์ฐ์ ๋๋ค. ์์ฑ์ด ์กด์ฌํ์ง๋ง ์ ์๋์ง ์์์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ๋ฅผ ํฌ์ฐฉํ์ง ๋ชปํฉ๋๋ค. ์์ ํ ์ ํํ๋ ค๋ฉด void 0 === undefined์ ๋น๊ตํ๋ ๋์ Object.hasOwnProperty()๋ก ํ์ธํฉ๋๋ค.
์๋ฏธ๊ฐ "์์ฑ b๊ฐ ์ง์คํ ๊ฒฝ์ฐ ์ฌ์ฉ"์ด๋ฉด ์ฝ๋๊ฐ ์ ์์ด๊ณ JS ๊ด์ฉ๊ตฌ์ ์ด๋ ์ ๋ ์ผ์นํฉ๋๋ค.
์ ... ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ง ์๋ ํ ... ๋ฐ์ด์ฌ๋ฆฐ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ด๊ฐ ์ณ์๋ค๋ ๊ฒ์ ๋์ฑ ์ฆ๋ช
ํฉ๋๋ค ... var result
๋ ์ธ ๊ฐ์ง ๊ฒฝ์ฐ ๋ชจ๋์์ ์ฌ์ ํ undefined
์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๋น์ ์ด ์์ ํ๋กํ ํ์
์ ํ์ฅํ์ฌ ์์ผ๋ก ๊ฐ์ ธ ์ค๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค ...
์ด ๊ธฐ๋ฅ์ ๋์์ ์ค๋ฅ๋ฅผ ์์ฑํ๋ ๋์ void 0
๋ก ๋จ๋ฝ์ํค๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. (๋ฉค๋ฒ๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ ํญ์ void 0์ ๋ฐํํด์ผ ํ๋ค๋ ์์ ์์ด๋์ด๊ฐ ๋ง์์ ๋ญ๋๋ค.)
''?.toString
์ ์๋๋ ์ถ๋ ฅ์ ๋ฌด์์
๋๊น?
@kevinb7 : ccc๊ฐ ํจ์๊ฐ ์๋๋ฉด ์ด๋ป๊ฒ ๋๋์? ์ค๋ช ํ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด __chain์ ํญ์ ์ ํจํ ํจ์๋ฅผ ๋ฐํํด์ผ ํ๋ฉฐ ๊ทธ๋ ์ง ์์ผ๋ฉด TypeError๊ฐ ๋ฐ์ํฉ๋๋ค.
์ข์ ์ง์ .
@metaweta : ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด toString
ํจ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ธฐ๋ํ๋ค๊ณ ์์ํ ์ ์์ผ๋ฏ๋ก ๊ทํ์ ์์ ์ด ์ด๋์ธ์ง ์ ์ ์์ต๋๋ค. 0, false, ๋๋ ''.
:+1:
Angular 2๋ ํ
ํ๋ฆฟ ๊ตฌ๋ฌธ์ Elvis ์ฐ์ฐ์๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
@๋ฉํ์จํ :
''?.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์ ๋ค์์ด ์๋ ๊ฒฝ์ฐ ์ด ๋ฐฉ์ถ(ํนํ _recursively_)์ ์ํํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค.
// foo.bar.baz = PropertySafeAccessExpression
// .name foo = Identifier
// .expr bar.baz = PropertySafeAccessExpression
// .expr bar = Identifier
// .name baz = Identifier
_์ฒซ ๋ฒ์งธ AST๋ฅผ JavaScript๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด ๋ณด์ธ์_ ๋ณต์ก์ฑ์ด ๋ ๋ช ํํด์ง๋๋ค. ์ด๊ฒ์ด ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค :์ฅ๋ฏธ:
@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 ๊ฐ ๋งํ ๊ฒ์ ๋ํ ๋์ ์ดํด(๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ๊ทธ๋ ๋๋ฅผ ๊ณ ์น ์ ์์ต๋๋ค - ํ์ ๋ํด ์ฃ์กํฉ๋๋ค!)๋ ?.
์ด ์ค๋ฅธ์ชฝ ์ฐ๊ด์ด ์๋๋ผ _์๋๋๋ค_ ๊ทธ๋ฌ๋ CoffeeScript์ ํน๋ณํ ๊ฒฝ์ฐ ์์ฑ์ ?.
์ ๊ถ๋ฆฌ๋ right-associative๊ฐ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด,
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๊ฐ is not that ?. is right-associative, but that CoffeeScript special cases property accesses on the right of the ?. to be right-associative
๋ผ๊ณ ์ค๋ช
ํ๋ฏ์ด ์ ๋ AST์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค.
์ฐ๋ฆฌ์ AST๋ ์ ์์ ์ธ ์๋ฏธ๋ก ์ ๋ถ์์ ์ ํฉํด์ผ ํ๋ฏ๋ก ๋ฐฉ์ถ ์ ์ฐจ๋ ์ด๋ฌํ ์๊ตฌ์ ๋ง๊ฒ ์ฝ๊ฐ ๋ ๋ณต์กํ ์ ์์ต๋๋ค.
@DanielRosenwasser ํผ๋๋ฐฑ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :์ฅ๋ฏธ:
@basarat ๊ฐ์ฌํฉ๋๋ค ๊ฐ์๊ธฐ ๋ชจ๋ ๊ฒ์ด ๋ช ํํด์ก์ต๋๋ค :smiley:
@basarat ์ 2์ ๋๊ธ๊ณผ ์ ์ฌํฉ๋๋ค, I.... _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 ์ฒด์ธ์ ๊ตฌ์ฑ์์ด "์์" ์ ํ์ด๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น? ์์ ํ ๊ฑฐ๋ถํ์๊ฒ ์ต๋๊น? ์๋๋ฉด ๊ทธ๋ฅ ๋๋๊ณ ์ต์ ์ ๋คํ ๊ฒ์ธ๊ฐ?
๊ธ์, ๋ด ์ ์? ์์ ํ ๊ธ์งํฉ๋๋ค. ์ง์ฅ๋งํผ ์ฐ์ํ์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. :-)
๊ทธ๋ฌ๋ ๋ด ๊ทผ๊ฑฐ:
any
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ฅ์๋ฅผ ์ฌ์ฉํ์ญ์์ค.any
๊ฐ ๋ง์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!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 : ?.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'];
๋๊ดํธ ํ๊ธฐ๋ฒ์ ๊ฒฝ์ฐ ๋๊ดํธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ ๊ณผ ์ผ๊ด์ฑ์ด ์์ผ๋ฏ๋ก ํ๋๊ฐ ์๋ ๋ ๊ฐ์ ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฐ๋ผ์ ์์ฑ ์ด๋ฆ๋ง ๋๊ดํธ๋ฅผ ํตํด ์ ์ ๋๋ ๋์ ์ ๋๋ค.
๋ ๊ฐ์ ์ ์ null ๋๋ ์ ์๋์ง ์์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๋ฅผ ๋ ์ค์งํ๊ณ ํํ์์ ๊ฒฐ๊ณผ๊ฐ null ๋๋ ์ ์๋์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํฉ๋๋ค. (d๋ null์ด๊ฑฐ๋ ์ ์๋์ง ์์).
๋ ๊ฐ์ ์ ์ ๋ ๋ช ํํ๊ณ ๊ฐ์์ ์ด๋ฉฐ ๊ณต๊ฐ์ ์ผ๋ก ๋ ์ ๋ณด์ด๋๋ก ํ์ฌ ์งํ ์ํฉ์ ์ดํดํ ์ ์๋๋ก ํฉ๋๋ค.
์ด๊ฒ์ ์ซ์๋ ์๋ง์ด ์๋๋๋ค. ์๋ฅผ ๋ค์ด ๋์ผํ ๊ฒฝ์ฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์
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
๋ฒํธ ๋ ๊ฐ์ง ์ต์ ์ ๋ํด: ์ด๋ ๊ฒ์ด ์ฑํ๋ ์ ์๋์ง ๊ทํ์ ์์ฒญ์ด์ง๋ง ๊ธฐ์กด ๊ท์น๊ณผ์ ํธํ์ฑ์ ์ํด ์ฒซ ๋ฒ์งธ ์ต์ ์ ๊ถ์ฅํฉ๋๋ค!
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.
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:
IMHO, ๋ ๊ฐ์ ์ ์ด ๋ ํผ๋์ค๋ฌ์ธ ๊ฒ์
๋๋ค. ๋ ๊ฐ์ ์ ์ด ๋ฒ์๋ฅผ ๋ํ๋ด๋ ์ธ์ด(์: 1..4
)๊ฐ ์์ผ๋ฉฐ TypeScript๋ ํฅํ ์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ฌผ์ํ๋ ๋ํ ๋ถํ์ค์ฑ ๋๋ ์กฐ๊ฑด์ ์๋ฏธ ๋ก ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ ๋ ๊ฐ์ ์ ์ ๋์ผํ ์๋ฏธ๋ฅผ ์ ๋ฌํ์ง ์์ต๋๋ค.
@schungx ์ถฉ๋ถํ ๊ณต์ ํ์ง๋ง a?['b']
๋๋ a?()
์ ๊ฐ์ ์ด์ํ ๊ฐ๋ฅ์ฑ์ ๋์์ด ๋ ๊ฒ์
๋๋ค.
+1 ?
a?['b']
๋ฐ a?()
๋ coffeescript์์ ์ ์๋ํ๋ฉฐ ์ ๋ณด๊ธฐ์ ์ข์ ๋ณด์
๋๋ค.
๊ทธ๋ฌ๋ ๋ค์ ๋งํ์ง๋ง ๋๋ ์ปคํผ ์คํฌ๋ฆฝํธ์ ๋์ด ๋ฉ ์๋ ์์ต๋๋ค.
+1 Ruby๋ ์กด์ฌ ์ฐ์ฐ์ https://twitter.com/mikepack_/status/657229703443451904๋ฅผ ๊ตฌํํ์ต๋๋ค. Typescript๋ ํน์ ๊ตฌ๋ฌธ์ ๊ด๊ณ์์ด ์ด๊ฒ์ ํ์๋ก ํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ๊น๋ํด์ง๋๋ค ๐
+1 ์ด๊ฒ์ด ํ์ํฉ๋๋ค!
์ ๋ฐ, implenent ?. C#์ฒ๋ผ ์ฐ์ฐ์
+1 ๋๋ ์ด๊ฒ์ ์ค๋ซ๋์ ๋์น๊ณ ์์๋ค
+1
์ฐ๊ธฐ ๋๋ฌด ์ถ์
ํจ: someVariable && someVariable.someMember
๋น์ ์ด ์ธ ์ ์์ ๋: someVariable?.someMember
+1, ์ด๊ฒ์ ์ข์ ๊ฒ์ ๋๋ค .... (๋์๊ฒ ๊ฐ์ฅ ์ํ๋ ๊ธฐ๋ฅ)
+1, ์ข์ ์๊ฐ์
๋๋ค!
๋จ, ๊ฐ์ฒด๊ฐ ๋ณต์กํ ๊ฒฝ์ฐ ํํ์์ ?๋ก ๊ฐ๋ ์ฐจ๊ฒ ๋ฉ๋๋ค. ๊ฐ ์์ฑ ๋ค์(var result=myValue?.a?.b?.c?.d?.e;) ๋ง์ง๋ง ๊ฐ(var result=?myValue.abcde;)์ ์์ ํด์ผ ํ ๋.
+1 - ์ด๊ฒ์ ํ๋ฆผ์์ด CoffeeScript์ ๊ฐ์ฅ ํฐ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ฉฐ 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
ํ๋์ ์ ํ์
๋๋ค. ๋ฌผ๋ก ์ ํ์ nullable์ด์ด์ผ ํ๊ณ ์ค์ ๊ฐ์ null์ผ ์ ์์ต๋๋ค. null์ด ์๋ ๊ฒฝ์ฐ z
ํ๋ ์ ํ์ด์ด์ผ ํฉ๋๋ค.
+1 ์ด๊ฒ์ ๋๊ท๋ชจ์ ๋ณต์กํ JS ํ๋ก์ ํธ์ ๊ฐ๋ฐ์ ์ฉ์ดํ๊ฒ ํ๋ ค๋ Typescript์ ๋น์ ๊ณผ ์ ์ด์ธ๋ฆฝ๋๋ค.
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ด ๊ธฐ๋ฅ์ด ๊ณ ๋ ค๋๋๋ก ์ปค๋ฎค๋ํฐ์์ ํฌํํ ๊ฒฝ์ฐ์ ๋๊น? ์๋๋ฉด ๊ณ ๋ ค๋์์ง๋ง ๋ช ๊ฐ์ง ์์ง๋์ด๋ง ๋ฌธ์ ๊ฐ ์์ต๋๊น?
ECMAScript ์์ํ์ ์ ์ ์์ด ์๋ก์ด ํํ์ ์์ค ๊ตฌ๋ฌธ์ ๋์ ํ๋ ๊ฒ์ ์ํํ๊ธฐ ๋๋ฌธ์ ์ง๊ธ๊น์ง ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค.
https://github.com/Microsoft/TypeScript/issues/16#issuecomment -57645069๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ค์์ ์ค์กด ์ฐ์ฐ์์ ๋ํ ์ต์ ๋ ผ์์ ๋๋ค(์๊ฐ์ ๋ง์ง๋ง ํ๋์ผ๋ก ๋ณด์ด์ง๋ ์์).
ES๋ก ๊ฐ์ ธ์ค๋ ค๋ฉด "+1"์ ์ด๋์ ์จ์ผ ํ๋์?
@msklvsk ESํ ๋ก
์ง๊ธ์ ๋ซ์ต๋๋ค. ํํ์ ์์ค์์ ์ด๊ฒ์ ์๊ตฌํ๋ TypeScript ํน์ ํญ๋ชฉ์ด ์ค์ ๋ก ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ข ๋ฅ์ ํฐ ์ฐ์ฐ์ ๋ณ๊ฒฝ์ ์ฌ๊ธฐ๊ฐ ์๋ ES ์ฌ์ ์์ํ์์ ๋ฐ์ํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ฌํ๊ฐํ๊ธฐ ์ํ ์ผ๋ฐ์ ์ธ ํธ๋ฆฝ์์ด์ด๋ ๋ค์ ๋จ๊ณ์ ๋๋ฌํ๋ ๊ตฌ์ฒด์ ์ธ ES ์ ์์ด๊ฑฐ๋ ์ด ๊ธฐ๋ฅ์ด ์ค๋ซ๋์ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๋ ES ์์ํ์ ์ผ๋ฐ์ ์ธ ํฉ์์ผ ๊ฒ์ ๋๋ค(์ฐ๋ฆฌ ์์ ์ ์๋ฏธ๋ฅผ ์ ์ํ๊ณ ํฉ๋ฆฌ์ ์ผ๋ก ๊ทธ๋ค์ด "์น๋ฆฌ"ํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค).
ํํธ์๋ ์ธ์
๋ ๋ฆฝ ์คํํ ์ญ์ :+1:s. GitHub ๋ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฑฐ๋ ๊ฐ๊น์ด TC39 ๋ด๋น์์๊ฒ ๊ฝ๊ณผ ์ฌํ์ ๋ณด๋ด์ฃผ์ธ์.
Coffeescript์ Swift์ ์ต์ํด์ง๋ฉด ๋๋๋ฆด ์ ์์ต๋๋ค. TS๋ ํ์ฌ ์ํ๋ก ๋์๊ฒ ์ฃฝ์์ต๋๋ค.
@algesten ์ฐ๋ฆฌ๊ฐ ์ธ์ด ์์ฒด๋ฅผ ๊ณ ๋ คํ๋ค๋ฉด swift
์ ๋ํด ๋์ํ ์ ์์ง๋ง ์ฅ๊ธฐ์ ์ธ coffescript
์ง์์ ๋ํด์๋ ํ์ ์ด ์์ต๋๋ค(์ ๋ ํ๋ก๋์
ํ๋ก์ ํธ์์ CoffeScript๋ฅผ ์ฌ์ฉํฉ๋๋ค). ์ฐ๋ฆฌ๋ coffescript
์ต๊ทผ ๋ช ๋
๋์ ๊ฐ์ฅ ๋น ๋ฅธ ์ฑ์ฅ์ ๋ณด์ธ ๋ฐ๋ฉด TypeScript
$2$#$์ ๋ํฅ์ ๋ช
ํํ๊ฒ ๋ณผ ์ ์๋ 2016๋
6์์ ์ธ์ด ๋ถ์ ๋ํฅ์ ๋์ํ ์ ์์ต๋๋ค.
TypeScript: Go ๋๋ Swift ์ธ์ ์ต๊ทผ ๋ช ๋ ๋์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ๋ ์ธ์ด๋ TypeScript์ ๋๋ค. Microsoft๊ฐ ์ง์ํ๋ JavaScript ์์ ์งํฉ๊ณผ Angular 2 ๊ธฐ๋ฐ์ 2๋ถ๊ธฐ ์ฐ์์ผ๋ก 31์์์ 26์๋ก ํฌ๊ฒ ์์นํ์ต๋๋ค. ์ด๋ ์์ 30๊ฐ ์ธ์ด ์ค ๊ฐ์ฅ ํฐ ๋จ์ผ ๋ณ๊ฒฝ ์ฌํญ์ด์ ์ ์ฒด์์ ๋ ๋ฒ์งธ๋ก ํฐ ์ ํ์์ต๋๋ค(ํ์ค ML, 7๊ฐ ์ง์ ). ์ค์ ๋ก #26์์ TypeScript๋ ํ์ฌ Erlang๊ณผ ๋๋ฅ ์ ์ด๋ฃจ๊ณ ์์ต๋๋ค. Powershell์ 1์, CoffeeScript์ 4์๋ฅผ ์ฐจ์งํ์ฌ ์์ 20์๊ถ ๋ฐ๋ก ๋ฐ์ ์์ต๋๋ค. ์ธ์ด๊ฐ ์ง๋ฉดํ ๋ฌธ์ ๋ ์ฑ์ฅํ ์ ์๋์ง ์ฌ๋ถ๊ฐ ์๋๋ผ ์ถ์ง๋ ฅ์ด ์๋์ง ์ฌ๋ถ์ ๋๋ค. ์์ผ๋ก 2~3๋ถ๊ธฐ ์์ ์์ 20์ ์์ ์ง์ ํ์ฌ ๊ทธ ๊ณผ์ ์์ CoffeeScript์ Lua๋ฅผ ์ ์น๊ณ ๋์ฝํ ๊ฒ์ ๋๋ค.
2014๋
๊น์ง coffescript
์ถ์ธ๋ ์ฌ๊ธฐ ์์ ๋ณผ ์ ์๋ฏ์ด ๊ธ์ ์ ์ธ ๊ฒ ์ด์์ด์์ต๋๋ค. ์ด๋๋ถํฐ ํ๋ฝ์ด ์์๋์์ต๋๋ค.
์๋ก์ด typescript 2.0 ์๊ฒฉํ null(์ ์๋์ง ์์) ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ํญ๋ชฉ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํจ์ ์ฐ๊ฒฐ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค!
์ด๊ฒ์ ECMAScript์ ๋ค์ ๋ฒ์ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด TypeScript๋ณด๋ค ๋ฐ๋๋ผ JavaScript์์ ํจ์ฌ ๋ ์ ์ฉํ ๊ฒ์ด๋ฉฐ ๊ตฌํ์ด ์ฌ์ค ํ์ธ๊ณผ ๋ฐ๋๋ก ์ ์๋์ง ์์๊ฑฐ๋ null์ ๋ํ ํ์ธ์ด ๋ ๊ฒ์ด๋ผ๋ ์ ์ ๊ณ ๋ คํ๋ฉด TC39์์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฐ๋จํด์ผ ํฉ๋๋ค.
JavaScript์์ ๊ด์ฉ์ ์ผ ์ ์๋ ๊ฐ๋จํ ๊ตฌํ์ null ๋๋ undefined๊ฐ ๋ฐ์ํ์ ๋ ๋จ์ํ ํ๋ก๋ฅผ ๋จ๋ฝ์ํค๊ณ undefined๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๋๋ค.
@bterlson ์ด๊ฒ ๋ง์ด ๋๋์? ๊ทธ๋ฌํ ์ ์์ด ๋ฐ์๋ค์ฌ์ง ํ๋ฅ ์ ์ผ๋ง๋ ๋ฉ๋๊น?
typescript์ ํฐ ์ฅ์ ์ค ํ๋๋ "๋ฏธ๋๋ ์ค๋ ๋น์ ์๊ฒ ์ฃผ์ด์ง๋ค"์ ๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ ์์ง ๊ฑฐ๊ธฐ์ ์์๋ ๋๋ผ์ด ๊ธฐ๋ฅ ์ค ํ๋์ ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๊ณง ์ถ๊ฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํจ์ ์ฒด์ด๋์ ๋์ค์ ์ธ ๊ด์ฉ๊ตฌ์ด๋ฉฐ ์๊ฒฉํ null ๊ฒ์ฌ๊ฐ ?๊ฐ ์๋๋ฉด ๋ ์ด์ ์๋ํ์ง ์์ต๋๋ค. ์ฐ์ฐ์๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.
TS 2 ๋ฉ์ง ๋ ๊ฒ์ฌ๋ ๊ผญ ์์ด์ผ ํ ์ข์ ๊ฒ์์ ๋ง๋ค์์ต๋๋ค!
์ด ์ค๋ ๋๋ฅผ ์ฝ์ผ๋ฉด์ ์ด๊ฒ์ด ์ ์ง ๊ด๋ฆฌ์๋ก๋ถํฐ ๋ ๋ง์ ๊ด์ฌ์ ๋ฐ์ง ๋ชปํ๋ ๋ฐฉ๋ฒ์ ๋๋์ต๋๋ค.
์ด์์ ์ธ ์ธ๊ณ์์ TypeScript๋ ES์ ๊ธธ์ ์ ๋ํด์ผ ํ๋ฉฐ ๊ทธ ๋ฐ๋๊ฐ ๋์ด์๋ ์ ๋ฉ๋๋ค. ์ง์งํ๊ฒ, TS ํ์ด ํญ์ ESx๊ฐ ๊ธฐ๋ฅ์ด๋ ๊ตฌ๋ฌธ์ ์ ์ํ๊ณ ๋ง๋ฌด๋ฆฌํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๋ฉด TypeScript๋ ์ด๋์ ์์ต๋๊น?
์ด ๊ตฌ๋ฌธ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ง์ ํ๋ฏ์ด ์ค์ ๋ก "ํ์"์ ๋๋ค. ์ง๊ธ๊น์ง ์ด ์ค๋ ๋์์ ์ข์ ์ ์์ ๋ฐ๊ธฐ๋ ํ์ต๋๋ค. ๊ตฌํ์ด ์ด๋ฌํ ๊ธฐ๋์ ๋ถํฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
a.b
๊ฐ ์ ํจํ ๊ฒฝ์ฐ์๋ง ์ปดํ์ผ ํ์์ ํํ์ a?.b
์ด ์ ํจํด์ผ ํฉ๋๋ค.null
๋๋ undefined
๊ฐ์ผ๋ก ์ค๊ฐ ํํ์์ ๋๋ฌํ๋ฉด ํด๋น ๊ฐ์ ๋ฐํ ๊ฐ์ด์ด์ผ ํฉ๋๋ค.ES์์ ๋ช ์ํ ๋ ์๊ฒฌ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์๋ ๋ถ๋ถ์ ๋ฌด์์ด๋ผ๊ณ ์๊ฐํ์ญ๋๊น?
a?.b
์ ๊ฒฝ์ฐ ๊ธฐ์กด(๋ฐ ๋ฏธ๋?) ๊ตฌ๋ฌธ๊ณผ์ ์ถฉ๋์ด ์์ต๋๋ค. ํ์๊ฐ ?.
ํ ํฐ์ ์ฐพ์ผ๋ฉด ์ด๋ฅผ '์์ ํ ํ์ ์ฐ์ฐ์'๋ก ์ทจ๊ธํ ์ ์์ต๋๋ค(@cervengoc์์ ์ค๋ช
ํ ๋๋ก ์์).
๊ตฌ๋ฌธ ์ถฉ๋์ a?(b)
๋ฐ a?[b]
๋ฅผ ํ์ฉํ ๋๋ง ๋ฐ์ํฉ๋๋ค. ์ด๋ ์ผํญ ?:
์ฐ์ฐ์ ํํ์์ ์์์ผ๋ก ํด์๋ ์๋ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ ์ฒ์์๋ ์ด๊ฒ๋ค์ ์ ์ณ๋๊ณ a?.b
๊ตฌ๋ฌธ๋ง ์ง์ํ๋ฉด ์ด๋ฏธ ๋ง์ ๊ฐ๋ฐ์๋ฅผ ๋ง์กฑ์ํฌ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค!
์ด์์ ์ธ ์ธ๊ณ์์ TypeScript๋ ES์ ๊ธธ์ ์ ๋ํด์ผ ํ๋ฉฐ ๊ทธ ๋ฐ๋๊ฐ ๋์ด์๋ ์ ๋ฉ๋๋ค.
ํํ ์์ค ๊ตฌ๋ฌธ์ ๊ด์ ์์ ์ฐ๋ฆฌ๋ ์ ๋์ ์ผ๋ก ๋์ํ์ง ์์ต๋๋ค. ํ์ค์ ์ถ์งํ๋ ์์ํ๊ฐ ์๋ ๋ฐ๋ ์ด์ ๊ฐ ์์ต๋๋ค. ํ ํ๋ ์ด์ด์ ์ผํ์ฑ ํ๋์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฏธ๋๋ฅผ ์ผ๋ฐฉ์ ์ผ๋ก ๊ฒฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด ์๋๋๋ค.
์ด ๊ตฌ๋ฌธ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ง์ ํ๋ฏ์ด ์ค์ ๋ก "ํ์"์ ๋๋ค.
์ด๊ฒ์ด TypeScript์ ํ์ํ์ด๋ผ๋ฉด JavaScript์ ํ์ํ์ ๋๋ค! ๋ค์ ํ ๋ฒ ECMAScript ์์ํ์ ์ฐ๋ ค ์ฌํญ์ ์ ๋ฌํ์ญ์์ค .
ES์์ ๋ช ์ํ ๋ ์๊ฒฌ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์๋ ๋ถ๋ถ์ ๋ฌด์์ด๋ผ๊ณ ์๊ฐํ์ญ๋๊น?
์ต์ํ ํด๋น ๊ฐ์ ๋ง๋ ๋ ๊ตฌ๋ฌธ์ด null
๋๋ undefined
๋ก ๋จ๋ฝ๋๋์ง, ์๋๋ฉด ํญ์ undefined
๋ก ๋จ๋ฝ๋๋์ง์ ๋ํ ์๊ฒฌ ๋ถ์ผ์น๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๊ดํธ๋ก ๋ฌถ์ธ ๊ตฌ๋ฌธ ํ์์ด ์ง์๋๋์ง ์ฌ๋ถ์ ๋ํ ๋
ผ์๋ ์์ ๊ฒ์
๋๋ค. a?.b.c
์ ๋์์ด ๋ฌด์์ธ์ง์ ๋ํ ์ง๋ฌธ๋ ์์ต๋๋ค. ?.
vs .?
vs a.b?
์ ๋ฌธ์ ๋ ์์ต๋๋ค. ์ด๊ฒ์ด delete
์ฐ์ฐ์์ ๋ฏธ์น๋ ์ํฅ์ ๋ํ ์ง๋ฌธ์ด ์์ต๋๋ค.
์ด์ ๋ํ ES DIScuss ์ค๋ ๋๋ 100๊ฐ๊ฐ ๋๋ ๋๊ธ์ด ์์ต๋๋ค. ๋ชจํธํจ์ด ๋ถ์กฑํ์ง ์์ต๋๋ค! ํ ๊ฐ์ง ์๋ฅผ ๋ฐ๋ก ๋ถ๋ฆฌํ์ฌ ๋ณด๊ณ ๋ง์ ์ฝ๋ ์ผ์ด์ค๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ์ฝ์ต๋๋ค. ์์ต๋๋ค. ์ด๊ฒ์ด ์๋ง๋ TC39์์ ์์ง ์๋ฌด๋ ์ด ๊ธฐ๋ฅ์ ์นํธํ์ง ์์ ์ด์ ์ผ ๊ฒ์ ๋๋ค. ๋ํ ์ฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๋์ํด์ผ ํ๋์ง์ ๋ํด ๋ง์ ๋ชจํธ์ฑ์ด ์๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด ์๋๋ฅด์ง ์๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค.
์ฃ์กํฉ๋๋ค. ์ธ๊ธ๋ ์ค๋ ๋๋ฅผ ์ฝ์ง ์์์ต๋๋ค. ๋ ๋ณด๊ธฐ ์ํด ํ์คํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ๋ด ๋๋ค. ์์ํ์ ๋ํด ์ ์์งํ ์๊ฒฌ์ผ๋ก๋ ์ด๊ฒ์ด JavaScript๊ฐ ๊ฒฐ์ฝ _์ข์ง ์์ ๊ฒ์ธ ๊ฐ์ฅ ํฐ ์ด์ ์ค ํ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ด๊ฐ ๋ณธ ๊ฒ ์ค ๊ฐ์ฅ ์ฑ๊ณต์ ์ธ ์ํํธ์จ์ด(์: Total Commander ๋๋ IrfanView)๋ *์์ํ๊ฐ ์๋๋ผ ํ ์ฌ๋์ด ์ ์ง ๊ด๋ฆฌํ๊ณ ์ค๊ณํ๊ธฐ ๋๋ฌธ์ ์ฑ๊ณตํ์ต๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ์์ ํ ์๋๋๋ค. ํ์ง๋ง ๋๋ ๊ฑฐ์ ํ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋น์ ํผ์ ์์ ํ ES6์ ์ค๊ณํ๋ค๋ฉด ์ง๊ธ ์ธ์์ ๋ ๋์ ๊ณณ์ด ๋ ๊ฒ์ ๋๋ค.
๋ํ, ๊ทํ๊ฐ ์ธ๊ธํ ๋ชจํธ์ฑ์ 99% _์ด๋ก ์ ์ธ_ ๊ฒ๋ค์ ์์ผ๋ฉฐ ๊ฐ๋ฐ์ ์ธก๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. null
๋๋ undefined
๊ฐ ๋ฐํ๋๋ ๊ฒ์ ๋ํด ๋๊ฐ ์ ๊ฒฝ์ ์ฐ๊ฒ ์ต๋๊น? ํ๋๋ง ์ ํํ๋ฉด ๊ทธ๋ ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
๋์ฒด๋ก, ๋น์ ๊ณผ ๊ทธ ์์ํ๋ ์ฐ๋ฆฌ ๋๋ถ๋ถ๊ณผ ๋ค๋ฅธ ํธ์ ์๊ณ , ๊ทธ ์ชฝ์ ์ผ์ ์ผ๋ฐ์ ์ผ๋ก ์ค์ ๋ณด๋ค ๋ ๋ณต์กํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ต์ํ์ ์ญ์์ฐ์ฑ์ ์ด๋ํ ์ ์์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์๋ค์ด์ง ๋ง์ญ์์ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ด๋ค ์ฌ๋๋ค์ ํ์์ค์์ ๋ ์์ฃผ ๋์ ์ผ๋ถ ์ฝ๋๋ฅผ ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฌผ๋ก ๊ธฐ๋ถ์ ์ํ๊ฒ ํ์ง ๋ง์ญ์์ค. ์๋ฌด ๊ฒ๋ ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์๋ค์ด์ง ๋ง์ญ์์ค. ์ ๋ฅผ ํฌํจํ์ฌ ๋ง์ ๊ฐ๋ฐ์์ ํด๋ผ์ด์ธํธ ์ธก ๊ฐ๋ฐ์ ํ๋ช ์ ์ผ์ผ์ผฐ๊ธฐ ๋๋ฌธ์ ์ ๋ ๊ทํ์ ๋ชจ๋ TS ํ์ ํฐ ์กด๊ฒฝ์ ํํ๋ฉฐ ๋ชจ๋ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ํน์ ๋ฌธ์ ์ ๋ํด ์ฝ๊ฐ ์ค๋งํ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ํ ๊ฐ์ง ์๊ฐ. ๋๋ ์ธ๊ธ๋ ES ์ฐ๋ ๋๋ฅผ ์ดํด๋ณด์๊ณ ํ ๊ฐ์ง ํ์คํ ๊ฒ์ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ์ง๋์น๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ค์ ๋ชจ๋ ์๋๋ฆฌ์ค์ ์ข์ ๊ฒ์ ๋์์ธํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์กฐ๊ฑด๋ถ ๋ฉค๋ฒ ์ก์ธ์ค ์ฐ์ฐ์์ ์์ ํ ๋ง์กฑํ๊ณ ๋ง์กฑํ ๊ฒ์ ๋๋ค. ์กฐ๊ฑด๋ถ ํธ์ถ, ์กฐ๊ฑด๋ถ ์ธ๋ฑ์ค ์๋ช ์ด ํ์ํ์ง ์์ผ๋ฉฐ ์ ํจํ JS ์ฝ๋์ธ ๋ชจ๋ ๋ฉ์ง ์๋๋ฆฌ์ค๋ฅผ ์ง์ํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ ๋ค์ผ. ๊ทธ๋ฌ๋ ๊ทธ ๋์ ๊ทธ๋ค์ ๊ณ์ ๊ทธ๊ณณ์ ์์ ๋ชจ๋ ๊ฒ์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ ๊ฒ์ ๋๋ค. ์ด๋ ํ๋ฅญํ ๊ณํ์ด์ง๋ง ํ๋ฃจ๊ฐ ๋๋๋ฉด ์๋ฌด ๊ฒ๋ ์ป์ง ๋ชปํ ๊ฒ์ ๋๋ค.
๋์ฒด๋ก, ๋น์ ๊ณผ ๊ทธ ์์ํ๋ ์ฐ๋ฆฌ ๋๋ถ๋ถ๊ณผ ๋ค๋ฅธ ํธ์ ์๊ณ , ๊ทธ ์ชฝ์ ์ผ์ ์ผ๋ฐ์ ์ผ๋ก ์ค์ ๋ณด๋ค ๋ ๋ณต์กํฉ๋๋ค.
๋ผ์ด์ธ์ด๋ TC39์ ์ง๋ฉด๋ชฉ์ ์ ํํ ๋ฐ์ํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. Ryan๊ณผ TypeScript ํ์ TypeScript์ ๋ํ ๋งค์ฐ ๋ช ํํ ์ค๊ณ ๋ชฉํ ๋ฅผ ์ค์ ํ์ต๋๋ค. ์ต์ด์ ํ์ฌ ๋ชฉํ ์ค ํ๋๋ TypeScript๊ฐ JavaScript์ ์์ ์งํฉ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ์ํ๋ ์ธ์ด๊ฐ ์๋๋๋ค(์: Dart, Haxe). ๊ตฌ๋ฌธ๊ณผ ๊ด๋ จํ์ฌ TypeScript ํ์ ์ฌ์ ๋ฐ๋ช (์: ๋ชจ๋)์ ๋น์ฉ์ ์ด๋ ต๊ฒ ๋ฐฐ์ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ ์๋ ES ๊ตฌ๋ฌธ์ด TypeScript๊ฐ ์ฌ์ฉํ๋ ๊ตฌ๋ฌธ๊ณผ ์์ ํ ํธํ๋์ง ์๋ ํด๋์ค์ private ๋ฉค๋ฒ์ ๋ํ ๋์ ์ ์ง๋ฉดํด ์์ต๋๋ค. ์์? ์ธ์ด์ ๋ฐํ์ ๋ฌธ์ ๋ฅผ ๊ฐ์ํ ๋ ํ๋ฉด์ ์ผ๋ก ๋ณต์กํด ๋ณด์ด์ง ์๋ ๊ฒ์ด ๋ฌ์ฑํ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ด ์๊ฒฌ์ผ๋ก๋ TC39๊ฐ JavaScript๋ฅผ "์ ์ฅ"ํ์ต๋๋ค. ES4๋ ํ๋ฅญํ๊ณ ํ์ ์ ์ธ ์์ด๋์ด๊ฐ ๋ถ์กฑํด์๊ฐ ์๋๋ผ ์ธํฐ๋ท์ ๊นจ๋จ๋ฆด ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฒ๋ ค์ก์ต๋๋ค. TC39๋ ๋ชจ์์ ๊ฐ์ถ์๊ณ ํ ๋ก ๊ณผ ์์ฌ ๊ฒฐ์ ๋ฐฉ๋ฒ์ ๊ณต์ ํ๊ณ ์์ ํ ๊ณต๊ฐํ์ผ๋ฉฐ ES4์ ๋งค์ฐ ์ ์ฌํ์ง๋ง ์ธํฐ๋ท์ ์์์ํค์ง ์์ ES2015๋ฅผ ์ ๊ณตํ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก 10๋ ์ ์ ์ฝ๋๋ฅผ ์คํํ๋ JavaScript ๋ฐํ์์ด ์๋ค๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ด์ง๋ง ์ธ์ด์ ๋ํ ๋ง์ ์ค์ํ ๊ฐ์ ์ฌํญ์ ์ง์ํฉ๋๋ค. ES2016์ ํญํ์ ์ผ์ ์ ์ ํจ์ด์์ต๋๋ค. ES2017์๋ "ํฉ๋ฆฌ์ ์ธ" ๊ธฐ๋ฅ๊ณผ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ผ๋ฉฐ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ ์ ์ํ๋ ๋ช ํํ ๊ด๋ฆฌ ํ๋ก์ธ์ค๊ฐ ์์ต๋๋ค.
๊ทธ๋์ ์ ์๊ฐ์๋ ์ฌ๋ฌผ์ "๋ค๋ฅธ ๋ฉด"์ ์๋ ๊ฒ์ด ๋ถ๋ช ํ ํจ๊ณผ๊ฐ ์์์ต๋๋ค. "ํ์" ๊ธฐ๋ฅ์ ํธ๋ฆฌํจ์ ๋ฅ๊ฐํ๋ ๊ฒ์ ๋๋ค.
@kitsonk "๋ค๋ฅธ ๋ฉด"์ ๋ถ์ ์ ์ผ๋ก ์๋ฏธํ๋ ๊ฒ์ ์๋์๊ณ ํนํ TypeScript๋ ES6์ ํฌ์ ๋ ์์ ์ ์ ํ์ํค๋ ค๋ ์๋๋ ์์์ต๋๋ค. ๊ฒ๋ค๊ฐ TypeScript IMO์ ๊ฐ์ฅ ์ข์ ์ ์ ๊ทธ๊ฒ์ด ์ค์ ๋ก ๋ช ํํ ์ค๊ณ ๋ชฉํ๋ฅผ ๊ฐ๊ณ ์๊ณ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ค๋ฅธ ๋ง์ ์คํ ์์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ํผ๋์ ๋น ์ง์ง ์๋๋ก ์ ๋ณดํธ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
์ ๋ ๋ฐ๋ก ์ด ๊ธฐ๋ฅ์ด ์ฒ์ฌ์ ์ธ ์ฌ๋๋ค์ด ์ฝ๊ณ ๋จ์ํ ๋ฐฉ์์ผ๋ก ๊ฐ๋ ๋์ ๊ฒฐ๊ตญ ์ง๋์น๊ฒ ์๊ฐํ๊ณ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ํธ์ถ์ด๋ ์์ธ ์๋ช ์ ์ง์ํ์ง ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ ํ ์ฌํญ์ ์์ฉํ๊ฒ ๋๋ ๋ถ๋ช ํ ์๋ผ๊ณ ๋งํ๊ณ ์ถ์์ต๋๋ค. ๊ทธ ํฌ๋ผ์ ๋๊ตฐ๊ฐ๋ ํ ๋น์ ์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ํ๋๋ฐ, ์ด๊ฒ์ ์ผ์ข ์ ๋ฏธ์น ์ง์ ๋๋ค. ๋๋ ์ฌ์ ํ ์ด ํ์์ด ๊ทธ๋ฐ ์๋ฏธ์์ ์ญํจ๊ณผ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์๋ฅผ ๋ค์ด ๊ฐ์ธ ํ์์ด ์ต์ข ES6 ๊ฐ๋ ๊ณผ ํธํ๋์ง ์๊ฒ ๋ ๊ฒ์ด ๊ทํ์ ์ ์ฅ์์ ๊ณ ํต์ค๋ฝ๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ํํธ์ผ๋ก, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ES6๋ณด๋ค ํจ์ฌ ์ด์ ์. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ ์ธก์ ์์ ์ ๋๋ค. ๋๋ต์ ์ผ๋ก ๋งํ์๋ฉด, ์ ์ ํ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ด๋ณด๋๋์ง ์ ๊ฒฝ์ฐ์ง ์๊ณ ๊ทธ์ ํ๋ณตํ๊ฒ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ชจ๋ ๋ฐ ๋ชจ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ์ฐ๋ฆฌ๋ (๋๋ ์ ์ด๋ ๋๋) ๋น์ ์ด ๊ทธ๊ฒ์ ๋ํด ๋งํ๋ ๊ณ ํต์ ๋ณด์ง ๋ชปํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ํญ์ private ๋ฉค๋ฒ๋ ๋ชจ๋์ ๋ง์กฑํ์ต๋๋ค.
์ด ํน์ ๊ธฐ๋ฅ์ ๋ด๊ฐ ์ฝ์ CoffScript์ ์์ต๋๋ค. ์ ์ฐ๋ฆฌ ๋จ์ํ ๊ฐ๋ฐ์๋ ํ๋ซํผ/๋ผ์ด๋ธ๋ฌ๋ฆฌ/ํ๋ฌ๊ทธ์ธ ๋ฑ์ ์ ํํ ๋ ํญ์ ํํ์ ํด์ผ ํฉ๋๊น? ๋ด ๋ง์ ํญ์ . ์ด๊ฒ์ ์ผ์ข ์ ์ฑ๊ฐ์ ์ผ์ ๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ํฐ ์ ์ฌ๋ ฅ์ ๊ฐ์ง ํ๋ฅญํ ์ธ์ด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด ์ธ์ด๋ 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
๋ throw๋์ง ์์ต๋๋ค. ~ Ryan์ ์ฝ์ ์ ์์ต๋๋ค.b
(a?.b).c
๋ throw๋์ง ์์ต๋๋ค~ Ryan์ ์ฝ์ ์ ์์ต๋๋ค.c
ํธ์ถ์ด null
๋ฅผ ๋ฐํํ๋ฉด a?.b.c().d
๋ undefined
๋ฅผ ๋ฐํํฉ๋๋ค. ~ Ryan์ ์ฝ์ ์ ์์ต๋๋ค.delete
์ฐ์ฐ์๊ฐ ์ง์๋ฉ๋๋ค.a?.[x]
์ด ์ง์๋ฉ๋๋ค.func?.(...args)
์ ๋ฉ์๋๊ฐ ์๋ ํธ์ถ(!)์๋ ์ง์๋ฉ๋๋ค.์ง๊ธ๋ถํฐ 2๋จ๊ณ ์ฌ์ด์ ํด๋น ์์ญ์์ ๋ณํ๊ฐ ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
๋๋ coffeescript๊ฐ ์ณ์๋ค๊ณ ์๊ฐํ๋ค.
a?.bc๋ b๊ฐ ์ ์๋์ง ์์ ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค.
?() ๋ฐ?[0] ๋ ๋ค ์ข์ต๋๋ค.
- ์ฐ๊ฒฐ๋ ์ ์ ์ ํ: b ๋ฐ c ์์ฑ์ด ์ ์๋์ง ์์ ๊ฒฝ์ฐ a?.bcd๊ฐ throw๋์ง ์์ต๋๋ค.
- ๊ดํธ๊ฐ ์๋ ๊ฒฝ์ฐ ์ ํ: b๊ฐ ์ ์๋์ง ์์ ๊ฒฝ์ฐ even (a?.b).c๋ throw๋์ง ์์ต๋๋ค.
- ์ ํ๋ ๋ฉ์๋ ํธ์ถ์์๋ ๋ฐ์ํฉ๋๋ค. 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 ์์ ํ ๋ค๋ฅธ ์๋ฏธ - getter์์ throw๋ ์์ธ๋ ๋ณํฉ์ ์ผ์ผํค์ง ์์์ผ ํฉ๋๋ค.
@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 ๊ฐ ๋งํ๋ฏ์ด ์ ์ด๋ 2๋จ๊ณ ๋๋ 3๋จ๊ณ๋ก ์งํ๋๋ TC39 ์ ์ ๊น์ง๋ ์งํ๋์ง ์์ ๊ฒ์ ๋๋ค.
==
๋ null
์ด๊ณ undefined
๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness
ํฌ๋กฌ ์ฝ์์์ ํต๊ณผํ ํ ์คํธ:
'' == undefined
false
0 == undefined
false
@kitsonk undefined๋ null๋ก ๊ฐ์ ๋ณํํ๊ณ ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ค๋ฅธ ๊ฐ์ undefined ๋๋ null๋ก ๊ฐ์ ๋ณํ๋์ง ์์ต๋๋ค.
์๋ชป๋ ๊ฐ๊ณผ ํผ๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. 0 ๋ฐ ""๋ ์ค์ ๋ก ๊ฑฐ์ง์ด์ง๋ง null์ด๋ undefined๋ก ๊ฐ์ ๋ณํ๋์ง ์์ต๋๋ค.
==
๋ ๊ฐ์ ๋ฅผ ์๋ฏธํฉ๋๋ค. null == 0
๋ undefined๋ฅผ ์ ์ธํ๊ณ ๋ null๋ก ๊ฐ์ ๋ณํํ ์ ์๊ธฐ ๋๋ฌธ์ false์
๋๋ค. 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๊ฐ ์์ผ๋ฏ๋ก ์ ๊ทผ์์ ๊ฒฐ๊ณผ๋ฅผ ํจ์ ๋งค๊ฐ๋ณ์์ ์ ์ฅํ๊ณ ์ํ๋ ๋งํผ ์ฐธ์กฐํ๊ณ ๋ ๋ฒ ์ด์ ํ๊ฐํ์ง ์์ ์ ์์ต๋๋ค. ์๋ ์์ ์์๋ ?.
์ฐ์ฐ์๊ฐ ํฌํจ๋ ํํ์ ๋์ ์ฌ๋ฌ ๋ฒ ํธ์ถํ ์ ์๋ coalesce
๋๋ค๋ฅผ ๋ง๋ญ๋๋ค.
์ธ์ด ๊ตฌํ์๊ฐ ๊ณ ๋ คํด์ผ ํ ํ ๊ฐ์ง๋ ํํ์ ์ค๊ฐ์ ์๋ ๋ฐฐ์ด ๋ฐ ํจ์ ํธ์ถ์ ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฌํ ์ํฉ์ ๊ฐ์งํ๊ณ ๋ณํฉ ํธ์ถ ๋์ ํด๋น ํํ์์ ์ถ๊ฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
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 , coalesce๋ฅผ ์ฌ์ฉํ ์์ ์์๋ ์ด์ ๊ฒ์ฌ๊ฐ 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 ๋ฉ๋ชจ ์์ฝ ์์ :
Optional Chaining Operators: 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๋จ๊ณ ์ ์๋ง ๊ตฌํํฉ๋๋ค. ๊ทธ๊ฒ์ด ๋งค์ฐ ์ค์ํ๊ณ TypeScript์์ ์ ์ฌ์ ์ผ๋ก ์ฌ์ฉ์ด ํ์ค์ ๋ฐ์ ์ ์ฃผ๋ํ๋ค๊ณ ๋ฏฟ๋ ๊ฒฝ์ฐ 2๋จ๊ณ ์ ์์ ๊ตฌํํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋ํด ๋ ๋ช ํํ๊ฒ ๋งํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์์ ๋งํ๋ฏ์ด ์ด๊ฒ์ ์ฐ๋ฆฌ์ ์งง์ ๋ชฉ๋ก์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ TC39๊ฐ ์ฐ์ฐ์์ ์๋ฏธ์ ๋ํ ์ผ์ข ์ ํฉ์์ ๋๋ฌํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ด๋๊ณ ์ฌ์ฉ์๋ฅผ ๊นจ๋จ๋ฆฌ๋ ๊ฒ์ ์ซ์ดํ ๊ฒ์ ๋๋ค.
์ ์์์ ๋ฌด๊ฒ๋ฅผ ๋๊ณ ์ถ๋ค๋ฉด ์ ์ ํ ์ฅ์์ ๊ฐ์ ์๊ฒฌ์ ๋งํ์ญ์์ค . ๋๋ ์๊ฒฌ์ด ์์ง๋ง ์ด ์ค๋ ๋์ ๋ฃ์ด๋ ์๋ฌด ์์ฉ์ด ์์ต๋๋ค.
๋๋ ํ์ฌ์ ํ์๋ฅผ ์ถฉ์กฑ์ํค๋ ๊ฐ๋จํ ๊ฒ์ ๋ง๋ค์์ต๋๋ค. ๊ฐ ๋งํฌ๊ฐ ์์ฑ ์ด๋ฆ์ธ ์ฒด์ธ์์๋ง ์๋ํ๋ฏ๋ก ์๋ฅผ ๋ค์ด ๋ฐฐ์ด์ ์์์ ์ก์ธ์คํ๋ ๊ฒ์ ์ง์๋์ง ์์ต๋๋ค.
TypeScript์์ ์ ๋ง ๊ฐ๋จํ Elvis ์ฐ์ฐ์ ๊ตฌํํ๊ธฐ
๋ํ lodash/underscore๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ฏธ _.get(Book, 'author.name.firstName')
๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ์์
์ ์ํํ ์ ์์ต๋๋ค.
ํธ์ง: _.get()
๋ฉ์๋์ ์ ํ ๋ฌธ์ ๋ก ์ธํด ์ด๊ฒ์ ๋์ ์กฐ์ธ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ ๋๊ธ ์ฐธ์กฐ
@tolgaek , _.get
์๋ ์๋ชป๋ ํ์ดํ์ด ์์ต๋๋ค. ์ด ๋ ๋์ ํ์ดํ (์ ์ ๋๋ฌธ์ ์์ง ๋ณํฉ๋์ง ์์ )์ ์ฌ์ฉํ๋๋ผ๋ typescript๋ ๊ฐ์ฒด์ ๊น์ด๊ฐ 1์ธ ๊ฒฝ์ฐ์๋ง ๊ฒฐ๊ณผ ์ ํ์ ํ์คํ ์ถ๋ก ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์๋ any
์
๋๋ค.
๋ฐ๋ฉด์ elvis ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด typescript๊ฐ ๊น์ด์ ๊ด๊ณ์์ด ๊ฐ์ฒด์ ๊ฒฐ๊ณผ ์ ํ์ ์ ์ถํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ elvis ์ฐ์ฐ์๋ฅผ ๊ธฐ๋ํ๋ ์ด์ ์ ๋๋ค.
์๊ฒ ์ต๋๋ค. ์ ๋ ฅ ๋ฌธ์ ๊ฐ ์๋์ง ๋ชฐ๋์ต๋๋ค. @BjornMelgaard ๊ฐ์ฌํฉ๋๋ค
@mhegazy ์ด ๊ธฐ๋ฅ์ ๋จผ์ ๊ตฌํํ๊ณ ์คํ ๊ธฐ๋ฅ์ผ๋ก ํ์ํ ์ ์์ต๋๊น? ์คํ์ ์ธ ๊ธฐ๋ฅ์์ ์ฌ์์ด ๋ณ๊ฒฝ๋๋ฉด ์ฌ๋๋ค์ด ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Elvis๋ ๊ทธ๋ ๊ฒ ์ค๋ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.
Babel7์ ๋์ฐฉํ์ต๋๋ค. Typescript, ์ฐ๋ฆฌ๋ ๋๋ฆฌ๊ฒ ์คํ๋๊ณ ์์ต๋๋ค. ๋๊ฐ ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ์ธ์.
:)
@gs-akhan the Babel ํ๋ฌ๊ทธ์ธ์ ๋ช ๊ฐ์ ์ ์ ์์ ์ด์ ๋ฒ์ ์ ๊ตฌํํฉ๋๋ค. ๊ทธ ์ดํ๋ก ์ ์์์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์๊ณ (์ฐ์ฐ์๊ฐ ๊ตฌ๋ฌธ ๋ถ์๋๋ ๋ฐฉ์์ ๋ํ ์๋นํ ๋ณ๊ฒฝ์ ํฌํจํ์ฌ) ๊ธฐ๋ฅ์ด 2๋จ๊ณ(3๋จ๊ณ๋ ๊ณ ์ฌ)์ ๋๋ฌํ๊ธฐ ์ ์ ๋ ๋ง์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๊ฒ์ด๋ฏ๋ก ํ์ฌ babel๋ก ์์ฑ๋ ๋ชจ๋ ์ฝ๋ ํ๋ฌ๊ทธ์ธ์ ์ค์ ๊ธฐ๋ฅ์ด ์ถ์๋ ๋ ์ค๋จ๋ ์ ์์ต๋๋ค. Babel์ ์ฌ์ ์์ฑ์ ๋ฐ ๊ธฐํ ์ดํด ๊ด๊ณ์๊ฐ ์ ์๋ ๊ธฐ๋ฅ์ ์ํํด ๋ณผ ์ ์๋๋ก ์ ์๋ ๊ธฐ๋ฅ์ด ์์ ํ๋๊ธฐ ์ ์ ์๋์ ์ผ๋ก ๊ตฌํํฉ๋๋ค. Babel์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค๊ณ ํด์ ๋ฏธ๋์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๊ฐ ํ์ํ์ง ์์ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ์ ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
@alangpierce ๋ง์ด ๋๋ค์. ๊ฐ์ฌ ํด์
๋๋ ์ด๊ฒ์ด ์ ๋ง, ์ ๋ง ์ข์ ์คํผ๋ ์ดํฐ๋ผ๋ ๊ฒ์ ์์ง๋ง, ๊ท์น์ด ์ ๋ฆฌ๋๊ธฐ ์ ์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๊ฒ์ ์ด์์ด๋ฉฐ ์ฐ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ํ์ง ์์ ๊ฒ์ ๋๋ค. ์ฐ์ฐ์์ ๋ฐํ์ ๋์์ ์ฌ์ ํ โโ์ ๋์ ์ ๋๋ค. ์ค๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ฆ์ ๋ช ํํ์ง ์์ ๋ฐฉ์์ผ๋ก ๋ด์ผ ์๋์ ๋ฉ์ถ ์ ์์ต๋๋ค. ๋๋ฌธ ์ถฉ๋, ๋ฐ์ดํฐ ์์, ๋๊ฐ ์๊ฒ ์ต๋๊น? ์ด์ ์กฐ๊ธ๋ง ์ฐธ์ผ๋ฉด ์์ผ๋ก ๋ช ๊ฐ์ ๋์ ๋ง์ ๊ณ ํต์ ํผํ ์ ์์ต๋๋ค.
์ฌ์์ด ์ค๋น๋ ๋๊น์ง ์ด ํฐ์ผ์ด ์ ๊ฒจ ์์ด์ผ(๋ซํ์ง ์์์ผ ํจ)ํด์ผ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค.
์คํ์ ์ธ์ ์ฏค ๋์ค๋์?
@oliverjanik ํ์ฌ ์ด์ ์ฌ์์ ์ฌ๊ธฐ ์์ ์ฐพ์ ์ ์์ต๋๋ค. ๋ค์ TC39 ํ์ (9/26-9/28)์์ ์ ์์ 2๋จ๊ณ๋ก ์งํํ๊ธฐ ์ํ ์์ ๊ฐ ์์ต๋๋ค. ๊ทธ ๋ ์ด ์ฌ๋ผ์ด๋ ๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์กฐ๊ธฐ์ ๊ฒํ ํ๊ณ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ค๋ ์ฌ๋๋ค์ ์ ์์ ๋ฆฌํฌ์งํ ๋ฆฌ ์ ๋ฌธ์ ๋ฅผ ์ ์ถํ์ธ์.
์ฐ๋ฆฌ๋ฅผ ์ํด ์ด ๋ฌธ์ ๋ฅผ ์นํธํด ์ฃผ์ @gisenberg ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ํผ๋์ ํผํ๊ธฐ ์ํด TC39 ํ์์์ ์ฌ์ฉํ ์ ์๋ ๊ตํ์ ์ฃผ๋ณ์ ์ต์
์ ์ ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋ ์์ฝ ์ฌ๋ผ์ด๋ ์๋ฃ๋ฅผ ๋ง๋ค๊น ์๊ฐํ์ง๋ง ์ด๋ฏธ ์๋ฃํ์ต๋๋ค. ๋ฉ์ง ์ผ!
TC39 ๋ํ(๋ฐ ์ฌ๋ผ์ด๋ ๋ฐํฌ)์ ๋์์ด ๋ ์ ์๋ ๋ค๋ฅธ ํ ๊ฐ์ง๋ ์๋ง๋ ๋ค๋ฅธ ์ธ์ด์์ ์ฐ์ฐ์์ ์๋ฏธ์ ๊ตฌ๋ฌธ์ ์ดํด๋ณด๋ ๊ฒ์
๋๋ค. ๋ค๋ฅธ ์ธ์ด๊ฐ Javascript์์ ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋์ง๋ฅผ ๋ฐ๋์ ์ง์ํด์๋ ์ ๋์ง๋ง, ํผ๋์ ํผํ๊ธฐ ์ํด ์ฐ์ฐ์๋ฅผ ๋ค๋ฅธ ์ธ์ด์ ์ฐ์ฐ์์ ์ ์ฌํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์
๋๋ค.
๋ค์์ฃผ๋ ์ ๋ถํํด!!!
๋ค์ ํ ๋ฒ ์ฃผ์ ์์ ๋ฒ์ด๋์ ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ Flow์์ _.get
์ ๊ฐ์ ์์ ํ getter ํจ์์ ๋ํด ๋ค์ ์๋ํ๋ ์ ํ ์ ์๋ฅผ ์ถ๊ฐํ ์ ์๋ค๋ ์ ์ ๋ํด ์ผ๋ถ ์ฌ๋๋ค์ด ํฅ๋ฏธ๋กญ๊ฒ ์๊ฐํ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์: flowtype.org/try
๊ฐ์ฅ ์์ ์ฝ๋๋ ์๋๋ฉฐ null๊ณผ undefined๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ๋ถํ์ง ๋ชปํ์ง๋ง ๊ทธ ์ธ์๋ ๊ฝค ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
AFAIK์์ TS์์ ๋๋ฝ๋ ์ ์ผํ ๊ฒ์ $NonMaybeType
์ ๊ฐ์ ๊ฒ์
๋๋ค.
๋ฌผ๋ก ์ด ์ฐ์ฐ์์ ํ์์ฑ์ ์์ ๋ ๊ฒ์ ์๋๋๋ค. ์ ๋ ๊ทธ๋ฅ ๋ฉ์ง๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ด๊ฒ์ ์ต๊ทผ TC39 ํ์์์ ๋๊ดํธ ๋ ์ ๋ ํธ์ถ ์ก์ธ์ค ๋ฐ ์๋ฏธ๋ก ์ ๋์( undefined
/ null
์ค๋ฅธ์ชฝ ํํ์์ ๋ถ์์ฉ์ ๋ํ ์์ธก ๊ฐ๋ฅ์ฑ)์ ๋ํ ๊ตฌ๋ฌธ ์ผ๊ด์ฑ์ ๋ํ ์ฐ๋ ค๋ก ์ธํด 2๋จ๊ณ์ ๋๋ฌํ์ง ๋ชปํ์ต๋๋ค. x.?b()
x.b
์ด number
)
(์ฉ์ ๊ณผ์ผ์ ๋์ง๋ ค๋ฉด ์ด ๋๊ธ์ ๐ ํฌํ)
์๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ ๋ง ์ง์ฆ๋๋ค์. ๋ ๊ฐ๋จํ์ง๋ง ์ฌ์ ํ ์ ์ฉํ๋๋ก ๋ฒ์๋ฅผ ์ขํ ํ์๊ฐ ์์ต๋๊น?
๋ ๊ฐ๋จํ์ง๋ง ์ฌ์ ํ ์ ์ฉํ๋๋ก ๋ฒ์๋ฅผ ์ขํ ํ์๊ฐ ์์ต๋๊น?
์ด๊ฒ์ TC39๊ฐ ์ง๋ฉดํ ๋์ ์
๋๋ค. ์ง์ฆ๋๊ธด ํ์ง๋ง ์ฌ๋๋ค์ด ์ด ์ผ์ ๊ฒช์ ์ ์์ด์ ๊ธฐ์ฉ๋๋ค. ์๋นํ ๋ณต์กํ ์์ค์ ๊ตฌ๋ฌธ์ ๋์
ํ๋ ๊ฒ์ ์ ๋ง ์ด๋ ต์ต๋๋ค. ์ฌ์ค ์ด ๊ฒฝ์ฐ ์ธ์ด์ ์ฝํ ํ์ดํ์ผ๋ก ์ธํด ์ค์ ๋ก ํด๊ฒฐํด์ผ ํ๋ ์๋นํ ์์ ์ฃ์ง ์ผ์ด์ค๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๐ฅ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ๋ฐ์ํฉ๋๋ค. ๋๊ตฌ์๊ฒ๋ ์ข์ง ์์ต๋๋ค. ์ด๋ฐ ์ฐ์ฐ์๋ฅผ ๋์
ํ๋ฉด ์ค์ ๋ก ๋ฒ์๋ฅผ ์ขํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ตฌํ์๊ฐ 90%์ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์ด์ง๋ง ยฏ\_(ใ)_/ยฏ
๊ฐ ๋๋จธ์ง 10%์ ๋ํด ์ ํจํ ์ฝ๋๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ฌ๋ฌ๋ถ, 3๋ ์ด์ ํ์, ์์ํ์ "์ฟ๋จน์ด๋ผ"๋ผ๊ณ ๋งํ๊ณ TypeScript์ ๊ด์ฉ์ ์ธ ๊ฒ์ด ๋ฌด์์ด๋ ์ฐ๋ฆฌ ์์ ์ ๋ฐฉ์์ผ๋ก ํ ๋๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์ด์จ๋ ์ด ๊ธฐ๋ฅ์ ์ ์ ์ ๋ ฅ ์์ด๋ ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค.
TC39 ์ ์๊ณผ ๋ช ์์ ์ผ๋ก ํธํ๋์ง ์๋ ๊ตฌ๋ฌธ์ผ๋ก TypeScript ๊ตฌํ์ ๋ง๋ญ๋๋ค. ES๊ฐ safe-nav ์ฐ์ฐ์๋ฅผ ์ป์ผ๋ฉด TypeScript์๋ ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค. ํ๋๋ ES์ ํธํ๋๋ ์ํฐ๋ฆฌ ์๋ฏธ ์ฒด๊ณ๊ฐ ์๊ณ ๋ค๋ฅธ ํ๋๋ ์ ํ ์์คํ ์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์ด๋ "์ ํ"๊ณผ ํจ๊ป TS ์์ ํ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ ๊ด์ฐฎ์ต๋๋ค.
@notsnotso Typescript๋ JS๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์์์ผ ํฉ๋๋ค. ์ด๊ฒ์ด Coffeescript์ ๋ชฉ์ ์ ๋๋ค.
์๋ง๋ ์ข์ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์งํ ๋งํด์ ์ด๊ฒ์ด ๊ฐ์ง ์์๋ค๋ ์ฌ์ค์ ๋๋ผ์ง ์์ต๋๋ค. ๋ด ์๋ณธ์์
ํฌ์คํธ์์ ์ธ๋ฑ์ฑ, ํจ์ ํธ์ถ ๋ฑ์ ๋ํ ๋ชจํธ์ฑ์ ์ง์ ํ์ต๋๋ค.
์์งํ ?.
์๊ฐํ๋ฉด ํ ์๋ก ์๋ ๊ฒ ๊ฐ์
undefined
๊ฐ ์์ผ๋ฏ๋ก JavaScript์ ์ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฒ์ฉ ์ ํธ๋ฆฌํฐ๋ฅผ ํจ์ฌ ๋ ์ ํธํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋. ๋ด๊ฐ ๊ฐ์ง ํ ๊ฐ์ง ์๊ฐ์ ์ธ๋ผ์ธ try/catch
๊ณผ ๊ฐ์์ต๋๋ค.
ํํ์( let x = try a.b.c else 0
)์ ๋ค์๊ณผ ๊ฐ์ ์ฐ์ฐ์์ ๊ฒฐํฉํ์ฌ
"falsey"(์: x || 1)๊ฐ ์๋๋ผ "null"(์: 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 Radkovskiy [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์ ๋ช ์๋ ๋ชฉํ ์ค ํ๋๋ ์คํ์ ์ธ JS ๊ธฐ๋ฅ์ ์ํํ๋ ๊ฒ์ด์์ต๋๋ค. ์์ฒด ๊ตฌํ์ ์ ๊ณตํ๋ TypeScript๋ ์์ฌํ ์ฌ์ง ์์ด ์์ํ์์ ์ด๋ฌํ ๋ ผ์๋ฅผ ์๋ฆฌ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์์ํ๊ฐ ๊ฒฐ๊ตญ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ธฐ ์ ์ ์ฌ๋ฌ๋ถ์ ํ๊ธฐ์ ์ธ ๋ณํ๋ฅผ ๊ธฐ๊บผ์ด ๋ฐ์๋ค์์ต๋๋ค. ์ ๋ ์ด ๊ธฐ๋ฅ์ด ์ ๊ทธ๋ ๊ฒ ๋ค๋ฅธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
async/await๋ ์ด๊ธฐ ๋จ๊ณ์์ TypeScript์ ๋์ ๋์์ต๋๋ค.
์ฆ, TS ํน์ ๊ธฐ๋ฅ์ Javascript๋ฅผ ์ค๋จํ์ง ์์ต๋๋ค.
"TS ํน์ ๊ธฐ๋ฅ"๊ณผ ๊ฐ์ ๊ฒ์ ์์ ๊ฒ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ TypeScript ๋์์ธ ๋ชฉํ ๋ฅผ ํ์ธํ์ธ์.
TypeScript๋ ES๊ฐ ๋ฐ์ ๊ธธ๋ก ๊ฐ๊ธฐ ์ ์ ๋์ฐฉํฉ๋๋ค. ๊ธฐ์กด์ ๊ฒ์ด ์์ ์ ์์ต๋๋ค.๊ทธ๋ค์ ๋จ์ง ํธํ์ฑ์ ์ํด ๋ณด๊ด๋ฉ๋๋ค.
TypeScript๋ ํด๋์ค, ๋ชจ๋, ๋๋ค๋ฅผ ๋ชจ๋ ECMAScript์ ๋์ ํ๊ธฐ ํจ์ฌ ์ ์ ์ถ๊ฐํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํนํ ๋ชจ๋์ ์ฌ์ ํ โโํผ๋์ ์ผ์ผํค์ง ์๋ ๊ฑฐ๋ํ ์ฌ์์
๋๋ค. TypeScript ํ์ด _mistake_์ ์๋ก ๋ฐ๋ณตํด์ ์ฌ์ฉํ๊ณ ๋๋ฌด ์ผ์ฐ ์ด์ ๋์ง ์์
๋๋ค. ์ ํฌ๋ ์ด์ ๊ฐ์ธ ํ๋๊ฐ ์ด๋ ดํ์ด ๋ํ๋๋๋ฐ ์ง๋ 5๋
๋์ private
์ ๋ํด ๋ค์ ํ ๋ฒ ๊ฐ์ฌํ์ง๋ง ํผ๋์ด ๋์ด์ง ์์ ๊ฒ์
๋๋ค.
๋ค์ ๋งํ์ง๋ง, ๋ฐ์ฝ๋ ์ดํฐ๋ ํ๋๊ทธ ์๋์์ ์ฌ์ฉํ ์ ์์ง๋ง ์ด์ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์ค์ ๋ก 3๋จ๊ณ์ ๋๋ฌํ๋ฏ๋ก TypeScript์ ๋ํ ์ฌ๊ตฌํ ๋ฐ ์ฝ๋ ์์์ด ํ์ํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ผ๋ค์ _ํ ์ ์๋_ ๊ฒ์ ๋๋ค.
async/await๋ ์ด๊ธฐ ๋จ๊ณ์์ TypeScript์ ๋์ ๋์์ต๋๋ค.
ECMAScript ์ ์์ด 3๋จ๊ณ์ ๋๋ฌํ๋ฉด
์๋ฌด๋ ์๋ชป ํ๋ํ์ง ์์ง๋ง ์ด ๋ํ๊ฐ ์ํด(๊น๋ฐ์ด ์์๋ค๋ฉด? ์ ์ฐ๋ฆฌ๋ ๊น๋ฐ์ ์๊ณ ์์) ๋๋ ์ฃผ์ ์์ ๋ฒ์ด๋(TS๊ฐ JS๊ฐ ๋์ง ์๋๋ค๋ฉด? ์๋์ 5๋ ํ์๋ ์ฐ๋ฆฌ๋ ๋ณํ์ง ์์ ๊ฒ์ ๋๋ค.) ๊ทธ๊ฒ์ ๋ํ ์ฐ๋ฆฌ์ ๋ง์), ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ฐ์ง ํ์๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฝ 3๋ ๋์ ES ์์ํ๊ฐ ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ ๊ทธ๋ฉด ์ ํํ ์ด๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ผ๊ณ ๋งํ์ต๋๋ค.
๋ค์ ํ ๋ฒ ์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ https://github.com/tc39/proposal-optional-chaining ์ด๋ฉฐ ์งํ ์ํฉ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์คํ๋ผ์ธ์์ ์์ ํ์ฌ ๋ค์ TC39 ํ์์์ ์ ์์ ๊ธฐํ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ด ํ์๋ ํต๊ณผ๋๊ธฐ๋ฅผ ์ ๋ง๋ก ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ๋ฐ์ดํธ: ์ค๋ ์คํ TC39์์ ์คํ ์ด์ง 2์ ๋๋ฌํ์ต๋๋ค!!!
๊ธฐ๋ ๋ชฉ์ ์ผ๋ก ๋ง ์ด ์ ๊ธ์ ๊ฐ๋จํ ํด์ ํฉ๋๋ค.
๋ง์ธ!
์คํธํ์ง๋ง์ธ์...
๊ฐ์ ์ ํํํ๋ ์ด๋ชจํฐ์ฝ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
์คํธํ์ง๋ง์ธ์...
๊ฐ์ ์ ํํํ๋ ์ด๋ชจํฐ์ฝ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
๊ฒ๋ค๊ฐ ์ด๋ ๊ฒ ์ด๋ชจํฐ์ฝ ์นด์ดํธ๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ฑธ ๋ณด๋ ์ฌ๋ฏธ๋ ์ ์ ํ๋ค. ์ด์ ๋๊ธ์ด ์ด๋ ๊ฒ ๋นจ๋ฆฌ ์ธ๊ธฐ๋ฅผ ์ป๋ ๊ฒ์ ๋ณธ ์ ์ด ์์ต๋๋ค!
์ค์๊ฐ ์ ๋ฐ์ดํธ ์์์ ์๊ฒ ๋ นํํ์ต๋๋ค https://youtu.be/JLBrgPjeGhc
๋๊ตฐ๊ฐ ์ด ์ผ์ ๊ตฌ๋ ์ทจ์ํ ์ ์์ต๋๊น?
@DanielRosenwasser ๋๋ด์ด ์๋๊ฑฐ๋ ๊ตฌ๋ ์ ์ทจ์ํ๊ณ ์ถ์ง๋ง ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๋ ์ฌ๋์ ์ํด ์ค๋ฅธ์ชฝ ์ฌ์ด๋๋ฐ์์ ์ด ๋ฒํผ์ ์ฐพ๊ณ ์์ต๋๋ค.
์ด๋ฉ์ผ์ ๋งํฌ๊ฐ ์๋ค๋ ๊ฒ์ ๋งํ ๊ฒ๋ ์์ต๋๋ค.
๋๋ด์ด์์ต๋๋ค. ์ ์์๋ฅผ ์์ฑ ์ค์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ ๊ธ ํด์ ํ ํ @RyanCavanaugh :
์ด ๋ ์ ๋๋์ด ๋ณด๊ฒ ๋์ด ์ ๋ง ๊ธฐ์ฉ๋๋ค! ๐ ๐
์ผ์นํ๋ VSCode ๋น ๋ฅธ ์์ ์ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค ๐
@RyanCavanaugh๋ ์๋ง๋ ์ด ์ค๋ ๋๋ฅผ ๊ตฌ๋ ํ์ง ์์ ๊ฒ์ด๊ณ ๋๋ ๋ฌด๋กํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๋๋ @RyanCavanaugh ๋ก ๊ฐ ๊ฒ์ ๋๋ค! (๊ทธ๋ฆฌ๊ณ ์ข์ ์ธก์ ์ ์ํด @DanielRosenwasser )
@kitsonk ๋ฐ๋ณด ๊ฐ ๋์ง ๋ง์ธ์. ์ฌ๋๋ค์ ์์ ๋กญ๊ฒ ๊ตฌ๋ ์ ์ทจ์ํ๊ณ ๊ดด๋กญํ์ ๋นํ์ง ์์ต๋๋ค.
@kitsonk , RyanCavanaugh ๋๋ DanielRosenwasser๊ฐ ์ด ์ค๋ ๋๋ฅผ ๊ตฌ๋ ์ทจ์ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? Ryan์ด ์ด ๋ฌธ์ ์ ์ ๊ธ์ ํด์ ํ๊ณ Daniel์ด ๊ทํ ์์ ์ธ ๊ฐ์ ๋๊ธ์ ์๋ตํ์ต๋๋ค.
๊ตฌ๋ ์ ์ทจ์ํ ๊ฒฝ์ฐ์๋ ์คํธ์ผ๋ก ์๋ฆผ ํผ๋ก๋ฅผ ๋ ๋ง์ด ์ ๋ฐํ ํ์๊ฐ ์์ต๋๋ค.
๋ถ๋ช ํ GitHub๋ ๋์์ ์ธ ์ ๋จธ๋ฅผ ์ํ ๋์ฐํ ์ฅ์์ ๋๋ค.
์ด ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ ๋ถ์พํ ์ธ๋ถ ์ฌํญ์ ์์๋ธ TC39์ ์ฑํผ์ธ์๊ฒ ํฐ ๊ฐ์ฌ๋ฅผ ๋๋ฆฝ๋๋ค!
๋ด ์๊ฐ์ @kitsonk ๋ ๊ทธ์ ๋๋ด์ ํ๊ณ ์์๋ ๊ฒ ๊ฐ์์. ๋ง์น ์ ๊ฐ ๊ทธ๋ฌ๋ ๊ฒ์ฒ๋ผ์. ์ฐ๋ฆฌ๊ฐ ํฅ๋ถ์ ๋ํด ์ฝ๊ฐ ๋ฐ๋ณด์ง์ ํ๊ณ ์๋ ๋์, ์ด๊ฒ์ CoC์ ๋ฐ๋ผ ์ํฉ์ ์์ ๋ฐ๋ฅด๊ฒ ์ ์งํ๋ผ๋ ๋ถ๋๋ฌ์ด ์๋ฆผ์ ๋๋ค.
@DanielRosenwasser
๋ด๊ฐ ์ด๊ฒ์ ์๋ํด์ผ ํ ์ ์์ต๋๊น? ๋๋ @rbuckton ์๋ ๋ ๋ค๋ฅธ ์ง์ ์ด ์กด์ฌํฉ๋๋ค ๐๐ปโโ๏ธ
์๊ฒ ์ต๋๋ค. https://github.com/microsoft/TypeScript/commits/optionalChainingStage1 ๐คฆ๐ปโโ๏ธ
์, ๋ถํํ๋ ๊ทธ๊ฒ์ ์๋นํ ๊ตฌ์์ ๋๋ค.
์ด ๋ฌธ์ ๊ฐ 5๋ ์ ์ ์ด๋ ธ์ต๋๋ค. :๋๋๋ค:
@rbuckton
์, ๋ถํํ๋ ๊ทธ๊ฒ์ ์๋นํ ๊ตฌ์์ ๋๋ค.
๋ด๊ฐ ์ด๊ฒ์ ์๋ํด ๋ณผ ์ ์์ต๋๊น?
@jhpratt @MatthiasKunnen ์ฃ์กํฉ๋๋ค. GitHub์์ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋์ผํ ์ปจํ ์คํธ๋ฅผ ๊ณต์ ํ์ง ์๋๋ค๋ ์ฌ์ค์ ์์์ต๋๋ค. ๋๋ ์ฌ๊ธฐ์์ ์ค๋ซ๋์ ์ฌ๊ธฐ์ ๊ธฐ ๋์๋ค๋ ๊ณ Ryan ๋ฐ Daniel IRL๊ณผ ํจ๊ป ์๊ฐ์ ๋ณด๋๊ณ ์ต๊ทผ์ ๋ด๊ฐ ์คํดํ ๋ด๋ถ ๋๋ด์ ์ผ์ผํจ ์ด๋ฒคํธ์ ์ ์ ์ฐธ์ฌํ์ต๋๋ค. ์ฌ๊ณผ.
์ด ์ ์ฒด ๋ฌธ์ ๋ TypeScript์ ๋์์ธ ์์น์ ๋ํ ํฅ๋ฏธ๋ก์ด ๊ณ ๊ณ ํ์ ๋ณด์ฌ์ค๋๋ค. Ryan์ TypeScript๊ฐ ECMAScript์์ ์ฌ๊ฐํ๊ฒ ๊ณ ๋ ค๋๊ธฐ ์ด์ ์ ๊ตฌ๋ฌธ์ ์ค์ ๋ก ๊ณ ๋ คํ์ ๋ ์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ์ต๋๋ค. TypeScript๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ธ์ด์ ์ฌ๊ฐํ ์ํฅ์ ๋ฏธ์น๋ ES2015 ๊ตฌ๋ฌธ์ ์์ธกํ๋ ๋ช ๊ฐ์ง ๊ตํ์ ๋ฐฐ์ฐ๊ณ ์๋ ์๊ธฐ์์ต๋๋ค. ํ์ TC39 3๋จ๊ณ ์ ์์ด ์์ ๋๊น์ง ํฌํจ์ ๊ณ ๋ คํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
@RyanCavanaugh ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ณ ๊ทธ๊ฐ ์ ์์ผ๋ก ๋ฐ์ํ ์ผ์ ๊ฐ๊น๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ํ์ด 2014๋ ์ ๊ตฌํํ ๊ฒ์ด ํ์ฌ Stage 3 ์ ์๊ณผ 100% ํธํ๋์ง ์์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. . ๋ฐ๋ผ์ ํ์คํ ์ถํํ ์ผ์ด์ง๋ง ์ ์์์ ๋์๊ณผ ์์ ํ ์ผ์นํ์ง ์๋ ์์ ํ ํ์ ์ฐ์ฐ์๊ฐ ํฌํจ๋ 5๋ ์ TypeScript ์ฝ๋๊ฐ ์๋ค๋ ์ ์๋ ๊ฐ์ฌํฉ๋๋ค.
๐
Waiting for TC39 ๋ผ๋ฒจ ์ ์ ๊ฑฐํด์ผ ํ๋ ์์ ์ธ๊ฐ์? ๐ค
Waiting for TC39 ๋ผ๋ฒจ ์ ์ ๊ฑฐํด์ผ ํ๋ ์์ ์ธ๊ฐ์? ๐ค
์ถ๊ฐ ship-it
์์ฐ
๋ง์นจ๋ด. ๋ง ๊ทธ๋๋ก ์ต์ ๋ ์ฒด์ด๋ y'day์ ๋ํด ๋ฌผ์ด๋ณด๊ณ ์์๊ณ , 3๋จ๊ณ๊ฐ ์ธ์ ์ผ์ง ๊ถ๊ธํดํ๊ณ , bam! ๊ทธ๊ฒ์ ํต๊ณผํ๊ธฐ ์ํด ๋ ธ๋ ฅํ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ๊ฐ์ฌํฉ๋๋ค!
์ด ์ค๋ ๋๋ฅผ ์ด๋ป๊ฒ ์์๊ฑฐํฉ๋๊น? :)
@opnksyn ์คํธ์ฑ ํฅ๋ถ์ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๋ฉด ์ด ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋์์ ๋ ์๋ฆผ์ ๋ฐ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐฉ๊ธ ์์ฑํ ๊ฒ๊ณผ ๊ฐ์ ์๋ฆผ์ ๋ชจ๋ ๋๊ธ์ด ํ์๋์ง ์์ต๋๋ค. ๐
์ด๋ฏธ ์ ์๋ ๋ฐฉ์ถ ์๋ฃจ์
์ด ์์ต๋๊น?
๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ํฅ๋ฏธ๋ก์ธ ์ ์์ต๋๋ค.
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
๋์ ์ ์ผ์ค ๋ฑํธ๋ฅผ ์ฌ์ฉํ์ฌ null
๋ฐ void 0
๋ชจ๋์ ๋น๊ต๋๋ ์ด์ ๊ฐ ์์ต๋๊น?
Babel์ด ์ปดํ์ผํ ์ฝ๋๊ฐ ๋จ์
== null
๋์ ์ ์ผ์ค ๋ฑํธ๋ฅผ ์ฌ์ฉํ์ฌnull
๋ฐvoid 0
๋ชจ๋์ ๋น๊ต๋๋ ์ด์ ๊ฐ ์์ต๋๊น?
@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์ "loose" ์ต์ ๊ณผ ์ ์ฌํ ์ต์ ์ tsconfig์ ์ถ๊ฐํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์ ์ํ๊ฒ ํ์ธํ ํ terser ๋ ์๋์ผ๋ก foo === null || foo === undefined
๋ฅผ foo == null
๋ก ๋ณํํฉ๋๋ค. ์ด๋ ์ด ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ก ์ธํด ์์ ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ด ๊ตฌํ๋์ง ์์๋ค๋ฉด lang ํ์ด Babel์ "loose" ์ต์ ๊ณผ ์ ์ฌํ ์ต์ ์ tsconfig์ ์ถ๊ฐํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์ด์ ๊ด๋ จํ์ฌ ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ๋ธ๋ผ์ฐ์ ์ ์ฝ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์๋ ๋น๋ ๋๊ตฌ์ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ TypeScript๋ฅผ ์ฌ์ฉํฉ๋๋ค!
์ฌ์ค, ์ฐ๋ฆฌ๋ TS์ Babel์ ํจ๊ป ์ฌ์ฉํ๋ฏ๋ก ์๋ง๋ ์ด๋ฌํ ์ต์ ์ค ํ๋๋ ์ฐ์ฐ์๋ฅผ Babel/๊ธฐ๋ณธ ๋ฐํ์์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ด์ด์ผ ํฉ๋๋ค!
@fbartho
์ฌ์ค, ์ฐ๋ฆฌ๋ TS์ Babel์ ํจ๊ป ์ฌ์ฉํ๋ฏ๋ก ์๋ง๋ ์ด๋ฌํ ์ต์ ์ค ํ๋๋ ์ฐ์ฐ์๋ฅผ Babel/๊ธฐ๋ณธ ๋ฐํ์์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ด์ด์ผ ํฉ๋๋ค!
์ด ๋๊ธ์ด ์ดํด๊ฐ ์๋ฉ๋๋ค. ์ฐ์ฐ์๋ฅผ Babel์ ์ ๋ฌํ๊ธฐ ์ํด ์ถ๊ฐ ์ต์
์ด ํ์ํ์ง ์์ต๋๋ค. Babel์ฉ์ผ๋ก TypeScript๋ฅผ ์ค์ ํ๋ค๋ฉด ์ด๋ฏธ noEmit: true
๊ฐ ์๊ณ ์ด๊ฒ์ ์ด๋ฏธ Babel๋ก _๋ชจ๋ ๊ฒ_์ ์ ๋ฌํฉ๋๋ค.
@Zarel Babel์ TypeScript ๊ตฌํ์๋ ๋ค์์คํ์ด์ค ๋ฐ const ์ด๊ฑฐํ์ ํฌํจํ์ฌ ์ฐ๋ฆฌ ์ฝ๋๋ฒ ์ด์ค๊ฐ ์ด๋ฏธ ์์กดํ๊ณ ์๋ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ด ๋๋ฝ๋์์ต๋๋ค. ๋ฐฉ์ถ์ด ํ์ฑํ๋ TSC๋ฅผ ์ฌ์ฉํ๊ณ ๋ ๋ฒ์งธ ๋ณํ์ผ๋ก Babel์ ์ ์ฉํฉ๋๋ค. (์ฐ๋ฆฌ๋ ๋ค์์คํ์ด์ค๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ง๋ง ์ผ์นํ์ง ์๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ ์ ์์์ง๋ ๋ถํ์คํฉ๋๋ค)
์ด ์ค๋ ๋์ ์ค๋ ์ฌ๋๋ค์ ์ด๊ธฐ ๋จ๊ณ 3 ๋ฐํ ์์ ์์ํ๊ณ ๊ฑฐ๊ธฐ์์ ์์ํ๋ ์ฃผ์์ ์ฝ์ด์ผ ํฉ๋๋ค(๋ชจ๋ ๊ฒ์ ๋ก๋ํ๋ ์ง์ ์ ์ธ ๋ฐฉ๋ฒ ์์ด ์๋ง์ ์ฌ์ฉ์ ์ฝํ ์ธ ๋ฅผ ์จ๊ธด GitHub๋ฅผ ๋น๋ํ์ธ์)
ํ๋ฅญํ ๊ธฐ๋ฅ - "์ ํ์ ์ฐ๊ฒฐ" / "์์ ํ ํ์". ํนํ TypeScript ์๊ฒฉ ๋ชจ๋์์. ์ด๊ฒ์ด ๊ณง ๊ตฌํ๋ ๊ฒ์ด๋ผ๋ ์์์ ๋ฃ๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. โค๏ธ
์ด๊ฒ์ ์ ๋ฅผ ์ฌ๊ธฐ๋ก ๋ฐ๋ ค์๊ณ ๊ทธ๊ฒ์ด ์ง์๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฅ ์ฌ์ฉ ์ฌ๋ก:
TypeScript 3.7์์ ์์๋ฉ๋๋ค.
document.querySelector('html')?.setAttribute('lang', 'en');
VS
ํ์ฌ TypeScript 3.5์ ์์ต๋๋ค.
const htmlElement = document.querySelector('html');
if (htmlElement) {
htmlElement.setAttribute('lang', 'en');
}
์ค๋ฅ ์์ด ์๋ํฉ๋๊น? ์๋๋ฉด ์ฌ์ ํ TypeError: Cannot read property 'setAttribute' of null.
์
๋๊น? ?
์์ . null / undefined ์ดํ์ ์ถ๊ฐ ์ฒด์ธ์ ์ทจ์ํด์ผ ํฉ๋๋ค.
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 ์ค๋ ๋์ ๋๊ธ์ ๋จ๊ธฐ๊ณ ์ถ์ดํ๋ ์ฌ๋์ด๋ผ๋ฉด ๋๊ตฌ๋ ๋จผ์ ์ด์ ๋๊ธ์ ๋ชจ๋ ์ฝ๊ธฐ๋ก ์ฝ์ํฉ๋๋ค. ์๋ง๋ ๊ทํ์ ์ง๋ฌธ๊ณผ ๊ทธ์ ๋ํ ๋ต๋ณ์ด ๊ทธ๊ณณ์ ์์ ๊ฒ์ ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ํ์ ์ฐ๊ฒฐ์ 3๋จ๊ณ์ ๋๋ค.
๊ธฐ๋ ๋ชฉ์ ์ผ๋ก ๋ง ์ด ์ ๊ธ์ ๊ฐ๋จํ ํด์ ํฉ๋๋ค.