Typescript: ์ œ์•ˆ: "์•ˆ์ „ํ•œ ํƒ์ƒ‰ ์—ฐ์‚ฐ์ž", ์ฆ‰ x?.y

์— ๋งŒ๋“  2014๋…„ 07์›” 15์ผ  ยท  205์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

ํ˜„์žฌ ์ƒํƒœ

  • TC39 ์ œ์•ˆ์€ ํ˜„์žฌ 3๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค(๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰).
  • ๊ตฌํ˜„์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค
  • TypeScript 3.7์—์„œ ์ด ๊ธฐ๋Šฅ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•ผ๊ฐ„ ๋นŒ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ์—ฌ๊ธฐ์—์„œ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์œ„์›ํšŒ์—์„œ ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•ด์งˆ ๋•Œ๊นŒ์ง€ ์„ ํƒ์  ํ˜ธ์ถœ ๋ณด๋ฅ˜

์—ด๋ฆฐ ์งˆ๋ฌธ

  • document.all ์ด(๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ) ์–ด๋–ค ํŠน์ˆ˜ ์ผ€์ด์Šค๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋‚˜์š”?

C# ๋ฐ ๊ธฐํƒ€ ์–ธ์–ด์—๋Š” ๊ฐœ์ฒด ๊ณ„์ธต ๊ตฌ์กฐ์˜ ์–ด๋Š ์ง€์ ์—์„œ๋‚˜ null (๋˜๋Š” ์ด ๊ฒฝ์šฐ undefined )๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ ์ฒด์ธ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ ‘๊ทผ์ž์˜ ๋ถ€์ž‘์šฉ์„ ์—ผ๋‘์— ๋‘๊ณ  ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์ฝ”๋”ฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


@DanielRosenwasser 2018๋…„ 2์›” 27์ผ ํŽธ์ง‘: ์ด ์ œ์•ˆ์€ "๋„ ์ „ํŒŒ" ์—ฐ์‚ฐ์ž๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Committed ES Next Suggestion Update Docs on Next Release

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์„ ํƒ์  ์—ฐ๊ฒฐ์€ 3๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

๊ธฐ๋… ๋ชฉ์ ์œผ๋กœ ๋งŒ ์ด ์ž ๊ธˆ์„ ๊ฐ„๋‹จํžˆ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  205 ๋Œ“๊ธ€

๋”ฐ๋ผ์„œ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

x && xy && xyz && xyzfoo

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ๋“  x, y, z, foo๊ฐ€ ๊ฐ๊ฐ ์ตœ๋Œ€ ํ•œ ๋ฒˆ๋งŒ ํ‰๊ฐ€๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋˜ํ•œ ๋งŽ์€ ๊ฒฝ์šฐ์— && ๋ฅผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ง„์‹ค์„ฑ์€ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์—๊ฒŒ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

"     "?.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 ์ฒด์ธ์˜ ๊ตฌ์„ฑ์›์ด "์ž„์˜" ์œ ํ˜•์ด๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ์™„์ „ํžˆ ๊ฑฐ๋ถ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๋†”๋‘๊ณ  ์ตœ์„ ์„ ๋‹คํ•  ๊ฒƒ์ธ๊ฐ€?

๊ธ€์Ž„, ๋‚ด ์ œ์•ˆ? ์™„์ „ํžˆ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ง€์˜ฅ๋งŒํผ ์šฐ์•„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. :-)

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ๊ทผ๊ฑฐ:

  1. ์ด๊ฒƒ์€ ์†๊ธฐ์ด๋ฏ€๋กœ ๋ˆ„๊ตฐ๊ฐ€ any ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์žฅ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  2. ๋ˆ„๊ตฐ๊ฐ€ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํƒ€์ดํ•‘ ์ง€์›์„ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ ์ฃผ๋ณ€์— any ๊ฐ€ ๋งŽ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!
  3. any ๋Š” ์ •๋ง ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋‹ค๋ฃจ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. any ์™€ ๊ฐ™์€ ์œ ์—ฐํ•œ ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์ด๋Ÿฌํ•œ ์†๊ธฐ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” any ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ œํ•œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ C์˜ (void *) ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ต์„ ๊ฑด๋„ค์ค€๋‹ค๋Š” ์‚ฌ์‹ค์ด ํ•ต์„ ๋ฐœ์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ๋ฐœ์‚ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ๋†€๋ผ์šด ์šด์˜์ž๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค !! ํŠนํžˆ ES6 / ES7 / TypeScript

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

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ํ˜ผ๋™ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋” ๋ช…ํ™•ํ•œ ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์—์„œ? b : ?.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

๋ฒˆํ˜ธ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์— ๋Œ€ํ•ด: ์–ด๋Š ๊ฒƒ์ด ์ฑ„ํƒ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ท€ํ•˜์˜ ์š”์ฒญ์ด์ง€๋งŒ ๊ธฐ์กด ๊ทœ์น™๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค!

  1. ์ง€๊ธˆ์ฒ˜๋Ÿผ ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( x.1.y == runtime error ).
var err = x..1..y; // should fail as well, since 1 is not a good property name, nor a number to call a method, since it's after x object.
  1. Number.prototype ์—์„œ ์†์„ฑ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋ฏ€๋กœ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
var err = x..1..y; // should work as well, resulting 'test' in this case
var err = x..2..y; // should work as well, resulting undefined in this case

๋™์  ์ด๋ฆ„ ์‚ฌ์šฉ:

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

์—ฌ๋Ÿฌ๋ถ„์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

PS foo?.bar ๋ฐ foo?['bar'] ๊ตฌ๋ฌธ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ? : ์—ฐ์‚ฐ์ž์™€ ?. ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ™์€ ์ค„์—์„œ ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ: ?. ๋ฐ ?['prop'] ์‚ฌ์šฉ

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

์ด์ค‘ ์  .. ๋ฐ ..['prop'] ์™€ ๋Œ€์กฐ์ ์œผ๋กœ

var a = { x: { y: 1 } };
var b = condition ? a..x..y : a..y..z;
var c = condition ? a..['x']..['y'] : a..['y']..['z'];
์–ด๋Š ๊ฒƒ์ด ๋” ๋ช…ํ™•ํ•ด ๋ณด์ž…๋‹ˆ๊นŒ?

๋งค์šฐ ํฅ๋ฏธ๋กœ์šด. :+1:

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"์„ ์–ด๋””์— ์จ์•ผ ํ•˜๋‚˜์š”?

์ง€๊ธˆ์€ ๋‹ซ์Šต๋‹ˆ๋‹ค. ํ‘œํ˜„์‹ ์ˆ˜์ค€์—์„œ ์ด๊ฒƒ์„ ์š”๊ตฌํ•˜๋Š” 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๊ฐ€ ์—ฐ์‚ฐ์ž์˜ ์˜๋ฏธ์— ๋Œ€ํ•œ ์ผ์ข…์˜ ํ•ฉ์˜์— ๋„๋‹ฌํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋‚ด๋†“๊ณ  ์‚ฌ์šฉ์ž๋ฅผ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ 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์˜ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„? ์ฐธ์„์„ฑ์ด ์—†๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์—ฐ์‚ฐ์ž, ์‹คํ—˜์  ๊ธฐ๋Šฅ(์˜ˆ: ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ), ๊ฒฝ๊ณ  ํฌํ•จ - ๋‚˜์ค‘์— ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ํ‘œ์ค€์ด ์ž‘์„ฑ๋  ๋•Œ 3๋…„์„ ๋” ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค. ๋น„์‹คํ—˜ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค. ํŠœํ† ๋ฆฌ์–ผ์„ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๋ฌด์—‡์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ •์  ํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์‚ฌ๋žŒ๋“ค์ด ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์ž ๊ตฌํ˜„์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ ๊ฒฝ๊ณ ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    "TypeScript์— ๊ด€์šฉ์ ์ธ ๊ฒƒ์€ ๋ฌด์—‡์ด๋“  ์šฐ๋ฆฌ ์ž์‹ ์˜ ๋ฐฉ์‹์œผ๋กœ ํ•˜์‹ญ์‹œ์˜ค"๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด 3๋…„ ์•ˆ์— ์‚ฌ๋žŒ๋“ค์€ t elvis๊ฐ€ js์—์„œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ ์ด๊ฒƒ์ด ๊ฐ€์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ์›๋ณธ์—์„œ
ํฌ์ŠคํŠธ์—์„œ ์ธ๋ฑ์‹ฑ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ์— ๋Œ€ํ•œ ๋ชจํ˜ธ์„ฑ์„ ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์†”์งํžˆ ?. ์ƒ๊ฐํ•˜๋ฉด ํ• ์ˆ˜๋ก ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„
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์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค!!!

์„ ํƒ์  ์—ฐ๊ฒฐ์€ 3๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

๊ธฐ๋… ๋ชฉ์ ์œผ๋กœ ๋งŒ ์ด ์ž ๊ธˆ์„ ๊ฐ„๋‹จํžˆ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์„ธ!

์ŠคํŒธํ•˜์ง€๋งˆ์„ธ์š”...

๊ฐ์ •์„ ํ‘œํ˜„ํ•˜๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ŠคํŒธํ•˜์ง€๋งˆ์„ธ์š”...

๊ฐ์ •์„ ํ‘œํ˜„ํ•˜๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์ด๋ ‡๊ฒŒ ์ด๋ชจํ‹ฐ์ฝ˜ ์นด์šดํŠธ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฑธ ๋ณด๋Š” ์žฌ๋ฏธ๋„ ์ ์ ํ•˜๋‹ค. ์ด์Šˆ ๋Œ“๊ธ€์ด ์ด๋ ‡๊ฒŒ ๋นจ๋ฆฌ ์ธ๊ธฐ๋ฅผ ์–ป๋Š” ๊ฒƒ์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค!

์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ์˜์ƒ์„ ์ž‘๊ฒŒ ๋…นํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค https://youtu.be/JLBrgPjeGhc

๋ˆ„๊ตฐ๊ฐ€ ์ด ์ผ์„ ๊ตฌ๋… ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@DanielRosenwasser ๋†๋‹ด์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ๊ตฌ๋…์„ ์ทจ์†Œํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์˜ค๋ฅธ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ์ด ๋ฒ„ํŠผ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

image

์ด๋ฉ”์ผ์— ๋งํฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.

image

๋†๋‹ด์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์„œ๋ฅผ ์ž‘์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ž ๊ธˆ ํ•ด์ œํ•œ ํ›„ @RyanCavanaugh :
martian

์ด ๋•…์„ ๋“œ๋””์–ด ๋ณด๊ฒŒ ๋˜์–ด ์ •๋ง ๊ธฐ์ฉ๋‹ˆ๋‹ค! ๐ŸŽˆ ๐ŸŽ‰

์ผ์น˜ํ•˜๋Š” VSCode ๋น ๋ฅธ ์ˆ˜์ •์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ๐Ÿ˜†

image

@RyanCavanaugh๋Š” ์•„๋งˆ๋„ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ณ  ๋‚˜๋Š” ๋ฌด๋ก€ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” @RyanCavanaugh ๋กœ ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค! (๊ทธ๋ฆฌ๊ณ  ์ข‹์€ ์ธก์ •์„ ์œ„ํ•ด @DanielRosenwasser )

@kitsonk ๋ฐ”๋ณด ๊ฐ€ ๋˜์ง€ ๋งˆ์„ธ์š”. ์‚ฌ๋žŒ๋“ค์€ ์ž์œ ๋กญ๊ฒŒ ๊ตฌ๋…์„ ์ทจ์†Œํ•˜๊ณ  ๊ดด๋กญํž˜์„ ๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@kitsonk , RyanCavanaugh ๋˜๋Š” DanielRosenwasser๊ฐ€ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋… ์ทจ์†Œํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Ryan์ด ์ด ๋ฌธ์ œ์˜ ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๊ณ  Daniel์ด ๊ท€ํ•˜ ์œ„์— ์„ธ ๊ฐœ์˜ ๋Œ“๊ธ€์— ์‘๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋…์„ ์ทจ์†Œํ•œ ๊ฒฝ์šฐ์—๋„ ์ŠคํŒธ์œผ๋กœ ์•Œ๋ฆผ ํ”ผ๋กœ๋ฅผ ๋” ๋งŽ์ด ์œ ๋ฐœํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ GitHub๋Š” ๋ƒ‰์†Œ์ ์ธ ์œ ๋จธ๋ฅผ ์œ„ํ•œ ๋”์ฐํ•œ ์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

์ด ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ์˜ ๋ถˆ์พŒํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์•Œ์•„๋‚ธ TC39์˜ ์ฑ”ํ”ผ์–ธ์—๊ฒŒ ํฐ ๊ฐ์‚ฌ๋ฅผ ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

thanks

๋‚ด ์ƒ๊ฐ์— @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 ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์ ์—๋„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ™

westwing

Waiting for TC39 ๋ผ๋ฒจ ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š” ์‹œ์ ์ธ๊ฐ€์š”? ๐Ÿค”

Waiting for TC39 ๋ผ๋ฒจ ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š” ์‹œ์ ์ธ๊ฐ€์š”? ๐Ÿค”

์ถ”๊ฐ€ ship-it

์™€์šฐ

๋งˆ์นจ๋‚ด. ๋ง ๊ทธ๋Œ€๋กœ ์˜ต์…”๋„ ์ฒด์ด๋‹ y'day์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณด๊ณ  ์žˆ์—ˆ๊ณ , 3๋‹จ๊ณ„๊ฐ€ ์–ธ์ œ์ผ์ง€ ๊ถ๊ธˆํ•ดํ•˜๊ณ , bam! ๊ทธ๊ฒƒ์„ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์Œ์†Œ๊ฑฐํ•ฉ๋‹ˆ๊นŒ? :)

@opnksyn ์ŠคํŒธ์„ฑ ํฅ๋ถ„์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐฉ๊ธˆ ์ž‘์„ฑํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์•Œ๋ฆผ์— ๋ชจ๋“  ๋Œ“๊ธ€์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

image

image

์ด๋ฏธ ์ •์˜๋œ ๋ฐฉ์ถœ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

    return undefined;
}

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

const foo: Foo|null = { }

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

๋‚˜๋Š” ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ๋ฒ”์œ„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Babel์ด ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค:

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

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

๋‚˜๋Š” ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ๋ฒ”์œ„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Babel์ด ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค:

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

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

๋™์˜ํ•ฉ๋‹ˆ๋‹ค, @ExE-Boss. ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ๋ฒ”์œ„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๊ฐ€ ์•ฝ๊ฐ„ ๋ชป์ƒ๊ธฐ๋”๋ผ๋„)

์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ES ์‚ฌ์–‘์— ๋Œ€ํ•œ ์„ฑ๋Šฅ๊ณผ ์ค€์ˆ˜๋Š” ๊ฐ€๋…์„ฑ๋ณด๋‹ค ํ™•์‹คํžˆ ์šฐ์œ„์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Babel์ด ์ปดํŒŒ์ผํ•œ ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœ == null ๋Œ€์‹ ์— ์‚ผ์ค‘ ๋“ฑํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 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 ์Šค๋ ˆ๋“œ์— ๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๊ณ  ์‹ถ์–ดํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ๋จผ์ € ์ด์ „ ๋Œ“๊ธ€์„ ๋ชจ๋‘ ์ฝ๊ธฐ๋กœ ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ท€ํ•˜์˜ ์งˆ๋ฌธ๊ณผ ๊ทธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ๊ทธ๊ณณ์— ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰