Typescript: ์ œ์•ˆ: nullable์ด ์•„๋‹Œ ์œ ํ˜•

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

JSDoc ๊ธฐ๋ฐ˜ ์œ ํ˜• ์„ ์–ธ์„ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ ๋„์ž…

var myString: !string = 'hello world'; //non-nullable
var myString1: ?string = 'hello world'; // nullable 
var myString2: string = 'hello world'; // nullable 
var myString3 = 'hello world'; // nullable

๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํ˜•์€ nullable์ž…๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ:

  • inferNonNullableType ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ์ถ”๋ก ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
var myString3 = 'hello world' // typeof myString is '!string', non-nullable
  • nonNullableTypeByDefault (๋” ๋‚˜์€ ์ด๋ฆ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) :
var myString: !string = 'hello world'; // non-nullable
var myString1: string = 'hello world'; // non-nullable 
var myString2: ?string = 'hello world'; // nullable 
var myString3 = 'hello world' // non-nullable
Committed Fixed Suggestion

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

๋งˆ๊ฐ๋œ ์ด์Šˆ์— ๋Œ€ํ•ด ๋Œ“๊ธ€์„ ๋‹ฌ๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋””์— ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋” ์ข‹์€ ๊ณณ์ด ์—†๊ณ  ๊ด€์‹ฌ์ด ์—†๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์ด์Šˆ๊ฐ€ ๋  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ผ๋ณ„๋กœ ์•”์‹œ์  null์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?
์˜ˆ๋ฅผ ๋“ค์–ด, noImplicitNull์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŽ์€ td ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ(๊ทธ๋“ค์€ ํ™•์‹คํžˆ ์œ ํ˜•์ด ์ง€์ •๋˜์–ด ์žˆ๊ณ  ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ƒ๊ฐ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—) ๋‚ด ์†Œ์Šค๋ฅผ implicitNull๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?
์•„๋ฌด๋„ ์ด๊ฒƒ์„ ์œ ์šฉํ•˜๊ฒŒ ์ƒ๊ฐํ• ๊นŒ์š”?

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

๋ณธ์งˆ์ ์œผ๋กœ nullable์ด๊ธฐ ๋•Œ๋ฌธ์— string ์ด์™ธ์˜ ์œ ํ˜•์„ ์˜ˆ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. :ํ”ผ
"!"์˜ ์‚ฌ์šฉ์ž์™€ ์ปดํŒŒ์ผ๋Ÿฌ ๋•Œ๋ฌธ์— nullable์ด ์•„๋‹Œ ์œ ํ˜•์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์ด ํ•ญ์ƒ null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋ฉฐ ์ด๋Š” JavaScript์—์„œ ์ง„์ •์œผ๋กœ ์ฃผ์žฅ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function(myNonNull:!myClass):void {
  myNonNull.foo();
}

๊ทธ๋ฆฌ๊ณ  null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋งŒ์กฑ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๋Š” null๊ณผ kaboom์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ณต๊ฐœ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ not null์„ ์ž๋™์œผ๋กœ ์–ด์„ค์…˜ํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ•์ œํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— !nonnull ์„ ์–ธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” public ์†์„ฑ(๋˜๋Š” ์‹ค์ œ๋กœ๋Š” private)์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ ์ ˆํ•˜๊ฒŒ ์‹œํ–‰๋˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ๊ณ„์•ฝ์— ๋Œ€ํ•œ ๋…ผ์˜๋กœ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„ํ‰๊ฐ€๋ฅผ ์šฉ์„œํ•˜์‹ญ์‹œ์˜ค. ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ์—ฌ๊ธฐ์— ์žˆ๋Š” ๊ฒฝ์šฐ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์ด ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด null ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” JavaScript์™€ ๋Œ€๋ถ€๋ถ„์˜ OOP ์–ธ์–ด์—์„œ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฏธ์ง• ADT๋Š” ์ด๋ฏธ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ, nullable์ด ์•„๋‹Œ ์ด์ „์— ์ž‘์„ฑ๋œ ์˜ค๋ž˜๋œ libs์— ๊ด€ํ•ด์„œ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์‚ถ์ด ๋” ๋‚˜์•„์ง€์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ ADT๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด null์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ์‚ฌ์–‘์— ๋”ฐ๋ผ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ๋งค์šฐ ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ ADT๊ฐ€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ์•ฝ๊ฐ„์˜ Maybe<T> ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ–ˆ๊ณ  ํ•ด๋‹น ์œ ํ˜•์˜ ๋ณ€์ˆ˜๊ฐ€ null์ด ๋˜์ง€ ์•Š๋„๋ก ๊ทœ์œจ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณธ์งˆ์ ์œผ๋กœ nullable์ด๊ธฐ ๋•Œ๋ฌธ์— string ์ด์™ธ์˜ ์œ ํ˜•์„ ์˜ˆ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. :ํ”ผ
"!"์˜ ์‚ฌ์šฉ์ž์™€ ์ปดํŒŒ์ผ๋Ÿฌ ๋•Œ๋ฌธ์— nullable์ด ์•„๋‹Œ ์œ ํ˜•์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์ด ํ•ญ์ƒ null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋ฉฐ ์ด๋Š” JavaScript์—์„œ ์ง„์ •์œผ๋กœ ์ฃผ์žฅ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜(myNonNull:!myClass): ๋ฌดํšจ {
myNonNull.foo();
}
๊ทธ๋ฆฌ๊ณ  null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋งŒ์กฑ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๋Š” null๊ณผ kaboom์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹ค์Œ์„ ์ •์˜ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

function myFunc(str: string): int {
 return str && str.length;
}

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ int ๋ฅผ ํ•ด๋‹น ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋ฉด ์˜ค๋ฅ˜๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. typescript์˜ ์žฅ์ ์€ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•  ๋‚ด์šฉ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์œ„์ž„ํ•˜๊ณ  nullable/non์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฒ€์‚ฌ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. -nullable ์œ ํ˜•์€ ๋‚˜์—๊ฒŒ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ SaferTypeScript์™€ ClosureCompiler๋Š” ์ด๋ฏธ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์— ๋Œ€ํ•ด ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•œ ์‚ฌ์–‘์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ ๊ธฐ๋ณธ ์œ ํ˜• 'null'์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  'null' ๋ฐ 'undefined'๊ฐ€ ์–ด๋–ค ์œ ํ˜•๊ณผ๋„ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” '๋” ์—„๊ฒฉํ•œ' ๋ชจ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ null ํ—ˆ์šฉ ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

var myNullableString: (null | string);
var myString = "hello";
myNullableString = myString //valid
myString = myNullableString // error null is not assignable to string;

'์—„๊ฒฉ ๋ชจ๋“œ'๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด typescript๋Š” nullable์ด ์•„๋‹Œ ๋ชจ๋“  ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋„ nullable์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

var myString: string; // error
var myNullableString: (null | string); // no error

function myString(param1: string, param2?: string) {
  // param1 is string
  // param2 is (null | string)
}

@fdecampredon +1

Facebook์ด TypeScript ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ์™€ ๊ฐ™์ด (null | T) ๋Œ€ํ•œ ์•ฝ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” Flow์— ๋Œ€ํ•œ IIRC - ?T ๋˜๋Š” T? .

var myString: string; // error

๋ณ€์ˆ˜๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ž ์žฌ์ ์œผ๋กœ ๋งค์šฐ ์„ฑ๊ฐ€์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

var myString: string;
if (x) {
myString = a;
} else if (y) {
myString = b;
} else {
myString = c;
}

์˜ˆ๋ฅผ ๋“ค์–ด Rust์—์„œ ์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ myString์ด ์‚ฌ์šฉ๋˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™”๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TypeScript์˜ ์ถ”๋ก ์€ ํ˜„์žฌ ์ด๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๊ฐ™์€ ์ผ์„ var myString = '' ๋Œ€์‹  var myString: string ๋„ˆ๋ฌด ๋งŽ์ด ๊ท€์ฐฎ๊ฒŒํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ทœ์น™์˜ ์ข…๋ฅ˜๋Š” ํ•ญ์ƒ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@fdecampredon +1 - ์ด ์•„์ด๋””์–ด๊ฐ€ ๋งค์šฐ ๋งˆ์Œ์—

(null | string) ์•ฝ์นญ์€ ?string ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  @johnnyreilly ๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ™•์ธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

ํ•ฉ๊ณ„ ์œ ํ˜•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ non-nullable์˜ ์•ˆ์ „ ์†์„ฑ์€ ๊ณผ์žฅ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Sum ์œ ํ˜•๊ณผ ๊ณ„ํš๋œ "if/typeof destructuring"(์ด๋ฅผ ๋ฌด์—‡์ด๋ผ๊ณ  ๋ถˆ๋Ÿฌ์•ผ ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ)์€ null ํ—ˆ์šฉ ๋ฐ null ํ—ˆ์šฉ์ด ์•„๋‹Œ API๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ์œ ํ˜•์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜•์‹์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ธฐ์กด์˜ ๊ฑฐ์˜ ๋ชจ๋“  ํƒ€์‚ฌ ํ˜•์‹ ์ •์˜ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์—„์ฒญ๋‚œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด 100% ์ฐฌ์„ฑํ•˜์ง€๋งŒ ์•„๋ฌด๋„ ์•ผ์ƒ์— ์žˆ๋Š” ์œ ํ˜• ์ •์˜๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ •์˜์— ๋Œ€ํ•œ ๋งŽ์€ ํ•ฉ์˜๊ฐ€ ConfirmedTyped ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ˆ˜์ง‘๋˜๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ์ „ํžˆ ์‹ค์งˆ์ ์ธ ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@samwgoldman ์•„์ด๋””์–ด๋Š” nonImplicitAny ์™€ ๊ฐ™์€ ํŠน์ˆ˜ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ์•„๋ž˜์—๋งŒ nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ์˜ ์ด๋ฆ„์€ strict ๋˜๋Š” nonNullableType ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์—†์Šต๋‹ˆ๋‹ค.

@fdecampredon DefinedTyped ์—์„œ์™€ ๊ฐ™์ด TypeScript๊ฐ€ ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์œ ํ˜• ์ •์˜๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ์ •์˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์‚ฌ ์ฝ”๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋‹ค์‹œ ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ "๋ฌธ์ž์—ด ๋ฐ˜ํ™˜"์œผ๋กœ ์ฃผ์„์ด ๋‹ฌ๋ ค ์žˆ์ง€๋งŒ ๋•Œ๋•Œ๋กœ null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜•์‹ ์ •์˜๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. nonNullableType 'ed ์ฝ”๋“œ์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜์— ์˜์กดํ–ˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ถˆํ‰ํ•˜์ง€ ์•Š๊ณ (์–ด๋–ป๊ฒŒ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?) ๋‚ด ์ฝ”๋“œ๋Š” ๋” ์ด์ƒ null-safeํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋น ํŠธ๋ฆฐ๊ฒŒ ์—†๋‹ค๋ฉด ์ด๊ฑด ํ”Œ๋ž˜๊ทธ๋กœ ์ผœ๊ณ  ๋Œ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ „๋ถ€ ์•„๋‹ˆ๋ฉด ์ „๋ฌด(all or nothing) ์˜๋ฏธ ๋ณ€๊ฒฝ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ”Œ๋ž˜๊ทธ ์ „ํ™˜ ๊ธฐ๋Šฅ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ๊ฒƒ์œผ๋กœ ์ž…์ฆ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ œ์ณ๋‘๊ณ , ์•„์ง Facebook์˜ Flow ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋งŽ์ง€ ์•Š์ง€๋งŒ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์˜ ๋น„๋””์˜ค ๋…นํ™”์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ ์–ด๋„ ์—ฌ๊ธฐ์—๋Š” ์•ฝ๊ฐ„์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™•์ธ์˜์ด ์†๊ธฐ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž ? type ์œ„ํ•ด type | null | undefined .

@fdecampredon DefinedTyped ์—์„œ์™€ ๊ฐ™์ด TypeScript๊ฐ€ ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์œ ํ˜• ์ •์˜๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ์ •์˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์‚ฌ ์ฝ”๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋‹ค์‹œ ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ "๋ฌธ์ž์—ด ๋ฐ˜ํ™˜"์œผ๋กœ ์ฃผ์„์ด ๋‹ฌ๋ ค ์žˆ์ง€๋งŒ ๋•Œ๋•Œ๋กœ null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜•์‹ ์ •์˜๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. nonNullableType' ์ฝ”๋“œ์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜์— ์˜์กดํ–ˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ถˆํ‰ํ•˜์ง€ ์•Š๊ณ (์–ด๋–ป๊ฒŒ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?) ๋‚ด ์ฝ”๋“œ๋Š” ๋” ์ด์ƒ null-safeํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ •์˜ ํŒŒ์ผ์€ nonNullableType ๋ชจ๋“œ์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” null ๋˜๋Š” undefined ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ •์˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.
์–ด์จŒ๋“  ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ํ™•์ธ/์ˆ˜์ • ์—†์ด ํ™•์‹คํžˆ ์œ ํ˜•์ด ์ง€์ •๋œ ์ •์˜๋ฅผ ๊ฑฐ์˜ ๊ณ ๋ฅผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ •์˜์— ? ์ ‘๋‘์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋น ํŠธ๋ฆฐ๊ฒŒ ์—†๋‹ค๋ฉด ์ด๊ฑด ํ”Œ๋ž˜๊ทธ๋กœ ์ผœ๊ณ  ๋Œ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ „๋ถ€ ์•„๋‹ˆ๋ฉด ์ „๋ฌด(all or nothing) ์˜๋ฏธ ๋ณ€๊ฒฝ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ”Œ๋ž˜๊ทธ ์ „ํ™˜ ๊ธฐ๋Šฅ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ๊ฒƒ์œผ๋กœ ์ž…์ฆ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

ํ”Œ๋ž˜๊ทธ ์ „ํ™˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทœ์น™์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

  • ์ผ๋ฐ˜ ๋ชจ๋“œ์—์„œ ? string ๋Š” string ํ•˜๊ณ  null ๋˜๋Š” undefined ๋Š” ๋ชจ๋“  ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • nonNullableType ๋ชจ๋“œ์—์„œ ? string ๋Š” string | null | undefined ์™€ ๋™์ผํ•˜๊ณ  null ๋˜๋Š” undefined ๋Š” null ๋˜๋Š” undefined ์ด์™ธ์˜ ๋‹ค๋ฅธ ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”Œ๋ž˜๊ทธ ์ „ํ™˜ ๊ธฐ๋Šฅ๊ณผ์˜ ๋น„ํ˜ธํ™˜์„ฑ์€ ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ?

์–ธ์–ด์˜ ์˜๋ฏธ๋ฅผ ๋ฐ”๊พธ๋Š” ํ”Œ๋ž˜๊ทธ๋Š” ์œ„ํ—˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ํšจ๊ณผ๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ๋งค์šฐ ๋น„๊ตญ์†Œ์ ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

function fn(x: string): number;
function fn(x: number|null): string;

function foo() {
    return fn(null);
}

var x = foo(); // x: number or x: string?

์ฝ”๋“œ ์กฐ๊ฐ์„ ๋ณด๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์œ ํ˜• ์‹œ์Šคํ…œ์„ "๋”ฐ๋ผ๊ฐˆ" ์ˆ˜ ์žˆ๊ณ  ๋งŒ๋“ค์–ด์ง€๋Š” ์ถ”๋ก ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด์˜ ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋งŽ์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ–๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ด๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์•ˆ์ „ํ•œ ์ข…๋ฅ˜๋Š” ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ์˜ ์˜๋ฏธ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ํ˜„์žฌ noImplicitAny ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”Œ๋ž˜๊ทธ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ ˆํŠธ๋กœ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @RyanCavanaugh์˜ ๊ด€์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ flowtype์„ ์‚ฌ์šฉ ํ•˜๋ฉด ์†”์งํžˆ ์ •๋ง ๊ท€์ค‘ํ•œ ๊ธฐ๋Šฅ ๋ง›๋ณธ ํ›„์—๋Š” ๊ทธ๊ฒƒ์ด ๊ฒฐ๊ตญ typescript์˜ ์ผ๋ถ€๊ฐ€ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

RyanCavanaugh์˜ ์˜๊ฒฌ์— ์ถ”๊ฐ€ํ•˜์—ฌ --> ๋‚ด๊ฐ€ ์–ด๋”˜๊ฐ€์—์„œ ์ฝ์€ ๊ฒƒ์—์„œ ES7 ์‚ฌ์–‘/์ œ์•ˆ์€ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์˜ ์‚ฌ์šฉ์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค(ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ๋‹ค๋ฆ„). ์ด๊ฒƒ์€ Javascript์— ๋งค์šฐ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ํ๋ฆ„ ๋ฌธ์„œ์—์„œ :

ํ๋ฆ„์€ null์„ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๊ณ ์œ ํ•œ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

var o = null;
print(o.x); // Error: Property cannot be accessed on possibly null value

๋ชจ๋“  ์œ ํ˜• T๋Š” ?T๋ฅผ ์ž‘์„ฑํ•˜์—ฌ null(๋ฐ ์ •์˜๋˜์ง€ ์•Š์€ ๊ด€๋ จ ๊ฐ’)์„ ํฌํ•จํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var o: ?string = null;
print(o.length); // Error: Property cannot be accessed on possibly null or undefined value

[Flow] ์ผ๋ถ€ ๋™์  ์œ ํ˜• ํ…Œ์ŠคํŠธ์˜ ํšจ๊ณผ ์ดํ•ด

(์ฆ‰, TS ์šฉ์–ด์—์„œ ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์ดํ•ดํ•จ)

var o: ?string = null;
if (o == null) {
  o = 'hello';
}
print(o.length); // Okay, because of the null check

์ œํ•œ ์‚ฌํ•ญ

  • ์•จ๋ฆฌ์–ด์‹ฑ์˜ ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ์ธํ•ด ๊ฐœ์ฒด ์†์„ฑ์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๊ฐ€ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

์ง€์—ญ ๋ณ€์ˆ˜ ์œ ํ˜•์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์™ธ์—๋„ Flow๋Š” ํŠนํžˆ ํ™•์ธ๊ณผ ์‚ฌ์šฉ ์‚ฌ์ด์— ์ค‘๊ฐ„ ์ž‘์—…์ด ์—†์„ ๋•Œ ๊ฐ์ฒด ์†์„ฑ ์œ ํ˜•์„ ์กฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐœ์ฒด์˜ ์•จ๋ฆฌ์–ด์‹ฑ์€ ์ด๋Ÿฌํ•œ ์ถ”๋ก  ํ˜•์‹์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด ์†์„ฑ์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋Š” ๋ณ„์นญ์„ ํ†ตํ•ด ํ•ด๋‹น ์†์„ฑ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ๋กœ ๋ฌดํšจํ™”๋  ์ˆ˜ ์žˆ๊ณ  ์ •์  ๋ถ„์„์ด ๋ณ„์นญ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • ์œ ํ˜• ๊ฐ€๋“œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ๋Š” ๊ฐœ์ฒด ์†์„ฑ์— ๋Œ€ํ•ด ์ค‘๋ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[D] null ๊ฒ€์‚ฌ๊ฐ€ ์•ˆ์ „์„ ์œ„ํ•ด ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๋”๋ผ๋„ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ null ๊ฒ€์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— null ํ—ˆ์šฉ ํ•„๋“œ๊ฐ€ ์ผ๋ถ€ ๋ฉ”์„œ๋“œ์—์„œ null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์ธ์‹๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋Ÿฐํƒ€์ž„(์˜ˆ๋ฅผ ๋“ค์–ด, ์ „์ž ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ํ•ญ์ƒ ํ›„์ž ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๋”ฐ๋ผ์˜จ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

  • undefined ์ด(๊ฐ€) ์„ ํƒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

null๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’๋„ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์€ JavaScript์—์„œ ์–ด๋””์—๋‚˜ ์žˆ์œผ๋ฉฐ ์–ธ์–ด์˜ ์‚ฌ์šฉ์„ฑ์— ์‹ฌ๊ฐํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ ๋Š” ์ด๋ฅผ ํ”ผํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฐ์—ด์—๋Š” ์š”์†Œ์— ๋Œ€ํ•œ ๊ตฌ๋ฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด ์†์„ฑ์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Flow๋Š” ์ด ๊ฒฝ์šฐ์— ์ ˆ์ถฉ์ ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ์ง€์—ญ ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ์ง€ํ•˜์ง€๋งŒ ๊ฐ์ฒด ์†์„ฑ ๋ฐ ๋ฐฐ์—ด ์š”์†Œ ์•ก์„ธ์Šค๋กœ ์ธํ•œ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ€๋Šฅ์„ฑ์€ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

null ์œ ํ˜•(๋ฐ ๋ฌผ์Œํ‘œ ์†๊ธฐ)์„ ๋„์ž…ํ•  ๋•Œ ์˜ต์…˜์ด ๋™์‹œ์— ์ถ”๊ฐ€๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ํŒŒ์ผ์— null ์œ ํ˜•์ด ์žˆ์œผ๋ฉด ๋ช…๋ น์ค„์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•ด nullable์ด ์•„๋‹Œ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋„ˆ๋ฌด ๋งˆ๋ฒ• ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

@jbondc๊ฐ€ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ! ๋๋‚  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค :p

It's tempting to want to change JavaScript but the reality is a 'string' is nullable or can be undefined.

์ด๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธ ํ•˜๋Š”๊ฐ€? js์—๋Š” ์ •์  ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๋ฌธ์ž์—ด์€ "nullable"์ด์ง€๋งŒ ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ  fooableํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋ง™์‹œ๋‹ค. ๋ชจ๋“  ๊ฐ’์€ ๋ชจ๋“  ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์œ„์— ์ •์  ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๊ณ„์ธตํ™”ํ•  ๋•Œ ์ •์  ์œ ํ˜•์ด nullable์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ง€ ์„ค๊ณ„์ƒ์˜ ๊ฒฐ์ •์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด๊ธฐ์—๋Š” nullable์ด ์•„๋‹Œ ํ˜•์‹์ด ๋” ๋‚˜์€ ๊ธฐ๋ณธ๊ฐ’์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ง€์ •๋œ ํ˜•์‹ ์™ธ์— null ๊ฐ’์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ ์„œ๋ช…์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜๋ฏธ ์ฒด๊ณ„์— ๋Œ€ํ•œ ๋ฒ”์œ„ ๋ณ€๊ฒฝ์„ ์œ ๋ฐœํ•˜๋Š” "use strict"์™€ ๊ฐ™์€ ์ง€์‹œ๋ฌธ์€ ์ด๋ฏธ ์–ธ์–ด์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. TypeScript์— "nullable์ด ์•„๋‹Œ ์œ ํ˜• ์‚ฌ์šฉ" ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@metaweta ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด _non null ๋ชจ๋“ˆ_์ด nullable ๋ชจ๋“ˆ์„ ์†Œ๋น„ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

//module A
export function getData(): string[] {
  return null;
}
//module B
'use nonnull'
import A = require('./A');

var data: string[] = A.getData();

๋ชจ๋“ˆ B์˜ data ๋Š” ์‚ฌ์‹ค nullable์ด์ง€๋งŒ 'use nonnull' ๋Š” ๋ชจ๋“ˆ A์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
์ง€์‹œ๋ฌธ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ์œผ๋กœ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋„ค,

var data: string[] = A.getData();

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  getData() ์ด null ๋ฐ˜ํ™˜ํ•  ๋•Œ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

var data: string[] = A.getData() || [];

@metaweta ok ํ•˜์ง€๋งŒ ์˜ค๋ฅ˜๋ผ๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์••๋‹ˆ๊นŒ? :)
getData ์œ ํ˜•์€ ์—ฌ์ „ํžˆ โ€‹โ€‹'() => string[]'์ž…๋‹ˆ๋‹ค. 'nullable ๋ชจ๋“ˆ'์—์„œ ์˜ค๋Š” ๋ชจ๋“  ๊ฒƒ์„ 'nullable'๋กœ ์ž๋™ ์ฒ˜๋ฆฌํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค(nullable ๋ชจ๋“ˆ์˜ ์œ ํ˜•์ด ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ).

์ด์ œ ํ•ด๋‹น ํŒŒ์ผ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŒŒ์ผ๋ณ„ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž… ํ•˜๊ธฐ์—๋Š” ์กฐ๊ธˆ ๋Šฆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•œ ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๊นŒ? ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ธฐ๋ณธ nullable์ด ์•„๋‹Œ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•˜๊ณ  ๊ธฐ๋ณธ nullable ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ/์ „ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ํ˜ผ๋ž€์„ ์ผ์œผํ‚ค๋‚˜์š”?
์ €๋Š” ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ No Implicit Any๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ์˜ต์…˜์ด ์ผœ์ ธ ์žˆ์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณผ ๋•Œ๋งˆ๋‹ค ๋†€๋ผ์›€์„ ๊ธˆ์น˜ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์•”์‹œ์  ์—†์Œ์€ ์ข‹์ง€๋งŒ ์–ธ์–ด๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๊ทธ๊ฒƒ์ด ๋ผ์ธ์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์ƒ, ๋‹ค๋ฅธ ๊ทœ์น™์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‹œ์ž‘ํ•œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ž˜๋ชป๋œ ๊ฐ€์ •๊ณผ ์‹ค์ˆ˜๋กœ ์ธํ•ด ๋งŽ์€ ์ƒ์‚ฐ์„ฑ์„ ์žƒ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@RyanCavanaugh ๋Š” ๋น„ ์ง€์—ญ์„ฑ์— ๋Œ€ํ•ด ์šฐ๋ คํ–ˆ์œผ๋ฉฐ ์ง€์‹œ๋ฌธ์€ ์–ดํœ˜ ๋ฒ”์œ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์‚ฌ์ดํŠธ์— ์ฃผ์„์„ ๋‹ฌ์ง€ ์•Š์œผ๋ฉด ๋” ์ด์ƒ ๋กœ์ปฌ์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŠน๋ณ„ํžˆ ์ด ์ง€์นจ์— ์ฐฌ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ต์…˜์ด ์กด์žฌํ•˜๊ณ  ์ ์–ด๋„ ES5์—์„œ "use strict"๋งŒํผ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋„ˆ๋ฌด ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฐ์•ˆํ•  ๋•Œ ์ €๋Š” ! ์–ด๋–ป๊ฒŒ ๋“ . @jbondc ์˜ ์ œ์•ˆ์„ ํ†ตํ•ด null๊ณผ undefined๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Java ๋ฐฑ์—”๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์‚ฌ๋žŒ๋“ค์ด ๋‘ ๊ฐ’์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ฐ€์žฅ ์œ ์šฉํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฏธ์•ˆ ํ•ด์š”, ๋‚˜๋Š” Ryan๊ณผ ๋™์˜ํ•˜๊ณ  ๋‚ด ์ž์‹ ์˜ ์šฐ๋ ค๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ use not-null ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“  null ํฌ์ธํ„ฐ ์˜ˆ์™ธ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€๊ฐ€๋ผ๋ฉด ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ์ง€๋ถˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. null ๋˜๋Š” undefined ๋ฅผ ๋ชจ๋“  ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋” ๋‚˜์œ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ๋งŒ๋“  ๊ทธ ํ™œ์ž.

@jbondc ์ €๋Š” '์—„๊ฒฉํ•œ ์‚ฌ์šฉ'์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€์ •์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฐ€์ •์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.

Not null์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ๊ตฌ๋ฌธ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์ง€๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋‹ค์Œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๊ธฐ๋Šฅ(์ƒ์„ฑ์ž์™€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๊ฐœ์˜ ์‚ฌ๋žŒ์ด๋ผ๊ณ  ๊ฐ€์ •)์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ฝ”๋“œ:

function myfoo (mynumber: number) {
    return !!mynumber;
} 

(ํ•ธ๋“œํฐ์œผ๋กœ ์“ฐ๋‹ค๋ณด๋‹ˆ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Œ)
์ผ๋ฐ˜ ํ”„๋กœ์ ํŠธ์™€ notnull ํ”„๋กœ์ ํŠธ ๋ชจ๋‘์—์„œ ์œ ํšจํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ฝ”๋”๊ฐ€ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ช…๋ น์ค„ ์ธ์ˆ˜๋ฅผ ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง์žฅ์—๋Š” ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ(์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์˜ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ ํฌํ•จ)์™€ ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ(์‹ค์ œ ์ฝ”๋“œ ํฌํ•จ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž…์ด ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋กœ ์ด๋™ํ•  ์ค€๋น„๊ฐ€ ๋˜๋ฉด(์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€ํ˜• ๊ตด์ ˆ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ) ์ฝ”๋“œ์—๋Š” ์˜ค๋ฅ˜๊ฐ€ ์—†์ง€๋งŒ ์ฝ”๋“œ ์‚ฌ์šฉ์—๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ ์•”์‹œ์  ์—†์Œ๊ณผ ๋‹ค๋ฅด๋ฉฐ ๋‘˜ ๋‹ค ์ฆ‰์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” strict๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ƒ๋‹นํ•œ ์˜ํ–ฅ๋ ฅ์„ ํ–‰์‚ฌํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹ด๋‹น์ž์—๊ฒŒ ์ด ์ƒˆ๋กœ์šด '๊ธฐ๋Šฅ'์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ๊ฒฝ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ผํ•˜๋‹ค.
ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๊ฐ„์— ์ฝ”๋“œ ๊ณต์œ ์™€ ์ฝ”๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๋งค์šฐ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด '๊ธฐ๋Šฅ'์œผ๋กœ ์ธํ•ด ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ๋˜๋Œ๋ฆฌ๊ณ  ์ด๋ฏธ ์™„๋ฃŒ๋œ ๊ธฐ๋Šฅ์„ '๊ณ ์ •'ํ•ฉ๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค @jbondc. @Griffork : ๊ทธ ์˜คํ•ด๋ฅผ ์žก์ง€ ๋ชปํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ง€์‹œ๋ฌธ์€ ํ”„๋กœ๊ทธ๋žจ ์ƒ์„ฑ ๋˜๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ์˜ ์ฒซ ๋ฒˆ์งธ ํ–‰์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด ํ‘œํ˜„์‹์ด๋ฉฐ ๊ทธ ํšจ๊ณผ๋Š” ํ•ด๋‹น ์ƒ์„ฑ์œผ๋กœ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

"use not-null";
// All types in this program production (essentially a single file) are not null

~ ๋Œ€

function f(n: number) {
  "use not-null";
  // n is not null and local variables are not null
  function g(s: string) {
    // s is not null because g is defined in the scope of f
    return s.length;
  }
  return n.toFixed(2);
}

function h(n: number) {
  // n may be null
  if (n) { return n.toFixed(3); }
  else { return null; }
}

nullable์ด ์•„๋‹Œ ์œ ํ˜•์€ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. nullable์ด ์•„๋‹Œ ์œ ํ˜•์€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์“ธ๋ชจ์—†๋Š”! ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์ด ์ •๋ง๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ NULL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์„ ์–ธํ•จ์œผ๋กœ์จ ์ž์‹ ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ฐพ์œผ๋ ค๊ณ  ํ•  ๋•Œ ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ˆ„๋ฝ๋œ ๊ฐ’(ํ˜„์žฌ NULL์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…)์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ฒฐ์ธก๊ฐ’์ด ์ „ํ˜€ ์—†๋Š” ๋˜‘๊ฐ™์ด ๊ฐ€ํ˜นํ•œ ์„ธ์ƒ์„ ์œ„ํ•ด ๋ชจ๋“  ๊ณณ์—์„œ NULL์ด ์žˆ๋Š” ๊ฐ€ํ˜นํ•œ ์„ธ์ƒ์„ ๊ตํ™˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ •๋ง๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์€ (๋‹ค๋ฅธ ๋งŽ์€ ๋ฉ‹์ง„ ๊ฒƒ๋“ค ์ค‘์—์„œ) ๋ˆ„๋ฝ๋œ ๊ฐ’(์ฒ˜์Œ์— ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋ช…๋ นํ˜• ์„ธ๊ณ„์—์„œ NULL๋กœ ํ‘œํ˜„๋˜๋Š” ๊ฒƒ)์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋Œ€์ˆ˜์  ๋ฐ์ดํ„ฐ ์œ ํ˜• ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ธ์–ด์— non-nullables๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๋ฐ˜๋Œ€ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ์ž˜ ์•Œ๋ ค์ง„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆœ์ง„ํ•˜๊ณ  ์–ด์ƒ‰ํ•œ ํ•ด๊ฒฐ์ฑ…์ธ ์“ธ๋ชจ์—†๋Š” ๊ตฌ๋ฌธ/์˜๋ฏธ ์“ฐ๋ ˆ๊ธฐ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. F#์˜ Optionals ๋ฐ Haskell์˜ Maybe, ๋ณ€์ข…(์ผ๋ช… ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” ๊ณต์šฉ์ฒด, ํŒ๋ณ„ ๊ณต์šฉ์ฒด) ๋ฐ ํŒจํ„ด ์ผ์น˜์— ๋Œ€ํ•ด ์ฝ์–ด๋ณด์„ธ์š”.

@aleksey-bykov JavaScript์— undefined ๋ฐ null ๋‘ ๊ฐ€์ง€ null ๊ฐ’์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ชจ๋ฅด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. JavaScript์˜ null ๊ฐ’์€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ •๊ทœ ํ‘œํ˜„์‹๊ณผ JSON์—์„œ ๋‚ ์งœ๋ฅผ ์ง๋ ฌํ™”ํ•  ๋•Œ๋งŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ธ์–ด๋กœ ๋œ ์œ ์ผํ•œ ์ด์œ ๋Š” Java ์• ํ”Œ๋ฆฟ๊ณผ์˜ ์ƒํ˜ธ ์ž‘์šฉ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” undefined ๊ฐ€ ์•„๋‹ˆ๋ผ null ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ฒด์˜ ์†์„ฑ์ด ์—†์œผ๋ฉด null ์•„๋‹ˆ๋ผ undefined ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. undefined ๊ฐ€ ์œ ํšจํ•œ ๊ฐ’์ด ๋˜๋„๋ก ๋ช…์‹œ์ ์œผ๋กœ ์›ํ•˜๋Š” ๊ฒฝ์šฐ propName in obj ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ์ด ์ƒ์†๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด ์ž์ฒด์— ์†์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด obj.hasOwnProperty(propName) . ๋ˆ„๋ฝ๋œ ํ•˜์œ„ ๋ฌธ์ž์—ด์€ -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: 'abc'.indexOf('d') === -1 .

Haskell์—์„œ Maybe๋Š” ๋ณดํŽธ์ ์ธ ํ•˜์œ„ ์œ ํ˜•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. Haskell์˜ ํ•˜๋‹จ ์œ ํ˜•์€ ๋ฒ”์šฉ ํ•˜์œ„ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ ๋น„์ข…๋ฃŒ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์ •์ˆ˜๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ํŠธ๋ฆฌ๋ฅผ ์›ํ•˜๋ฉด ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ null ๋˜๋Š” undefined ๊ฐ€ ์•„๋‹Œ ์ •์ˆ˜๋ฅผ ๊ฐ–๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ๋“ค์„ ์›ํ•œ๋‹ค๋ฉด, ๋‚˜๋Š” Maybe int๋‚˜ ์ง€ํผ๋กœ ๋ ˆ์ด๋ธ”์ด ๋ถ™์€ ๋‚˜๋ฌด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

"use not-null" ์ง€์‹œ์–ด๋ฅผ ์ฑ„ํƒํ•œ๋‹ค๋ฉด "use not-void"(null๋„ undefined๋„ ์•„๋‹˜)๋„ ์›ํ•ฉ๋‹ˆ๋‹ค.

null์—์„œ ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์žฅํ•˜๋ ค๋ฉด null์„ ๊ธˆ์ง€ํ•˜์‹ญ์‹œ์˜ค.
๋ฆฌํ„ฐ๋Ÿด. nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์€
์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ๋“ค์ด ๋ฌด์—‡์—์„œ ์™”๋Š”์ง€ ์•ˆ๋‹ค๋ฉด
๋‹น์‹ ์€ ๊ทธ๋“ค์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Haskell์˜ ๋ฐ”๋‹ฅ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ์›ํ•œ๋‹ค
JavaScript(TypeScript)์—๋Š” ๊ฐ’์ด ์—†๋Š” ์ „์—ญ ์ˆ˜ํผ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ทธ๋ฆฝ๋‹ค
๋‚ด๊ฐ€ ํ‘œํ˜„์„ ๋˜์ ธ์•ผ ํ•  ๋•Œ ์‹ฌํ•˜๊ฒŒ. ๋‚˜๋Š” TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
v 0.8 ์ดํ›„๋กœ null์ด ํ•„์š”ํ•œ ๊ฒƒ์€ ๊ณ ์‚ฌํ•˜๊ณ  null์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋ฌด์‹œํ•ด
with ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์“ธ๋ชจ์—†๋Š” ์–ธ์–ด ๊ธฐ๋Šฅ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ
์„ฑ๋ช….

@aleksey-bykov ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑ ์ค‘์ด๊ณ  ์ž…๋ ฅ์ด null์ด ์•„๋‹˜์„ ๋ณด์žฅํ•˜๋ ค๋ฉด ๋ชจ๋“  ๊ณณ์—์„œ ๋Ÿฐํƒ€์ž„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์œ„ํ•œ ์ปดํŒŒ์ผ ํƒ€์ž„ ํ…Œ์ŠคํŠธ๋ฅผ ์›ํ•˜๋Š”๋ฐ ์ œ๊ณตํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š์œผ๋ฉฐ Closure์™€ Flow๋Š” ๋ชจ๋‘ non-null/undefined ์œ ํ˜•์— ๋Œ€ํ•œ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@metaweta , null๋กœ๋ถ€ํ„ฐ ์ž์‹ ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋˜๊ธฐ ์ „์— lib๋ฅผ ์šธ๋ฆฌ๋Š” pleaseNonNullablesNumbersOnly(<any> null) ๊ฐ™์€ ์ˆ˜๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. js๋กœ ์ปดํŒŒ์ผํ•œ ํ›„์—๋Š” ๊ทœ์น™์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ์™œ ์‹ ๊ฒฝ์„ ์“ฐ๊ฒ ์Šต๋‹ˆ๊นŒ? nulls are not supported, you put a null you will get a crash ๋ฉด์ฑ… ์กฐํ•ญ์ฒ˜๋Ÿผ ํฌ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜์„ธ์š”. ๋ชจ๋“  ๋ถ€๋ฅ˜์˜ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ์ž์‹ ์„ ๋ณด์žฅํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ฑ…์ž„ ๋ฒ”์œ„๋ฅผ ๋Œ€๋žต์ ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์…‹์งธ, ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋ฐฉํƒ„์ธ ์ฃผ์š” ์ฃผ๋ฅ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฑฐ์˜ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฏธ์นœ ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹น์‹ ์˜ ๋…ธ๋ ฅ์€ ๋ฌธ์ œ๊ฐ€ ๋  ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@aleksey-bykov ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํด๋ผ์ด์–ธํŠธ๋„ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ๋ฐ›๋Š”๋‹ค๋ฉด null์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹คํžˆ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด TypeScript์˜ ์š”์ ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ถ”๋ก ์— ๋”ฐ๋ฅด๋ฉด ์œ ํ˜•์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์ƒ ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ๋ฌธ์„œ์—์„œ "ํฌ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜์‹ญ์‹œ์˜ค".

์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚˜ null์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด undefined์— ๋Œ€ํ•ด ํ™•์ธํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— null์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’๊ณผ ๋ˆ„๋ฝ๋œ ์ˆซ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ํ•œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์ œ:
null์ด ๋‹ค๋ฅธ ์ฝ”๋“œ๋กœ '์ด์Šค์ผ€์ดํ”„'๋˜๋Š” ๋ฌธ์ œ๋Š” ์—†์—ˆ์ง€๋งŒ ์ž„์˜์˜ undefinedes ๋˜๋Š” NaN์ด ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ํ”Œ๋ž˜๊ทธ๋ณด๋‹ค ์‹ ์ค‘ํ•œ ์ฝ”๋“œ ๊ด€๋ฆฌ๊ฐ€ ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒ€์ดํ•‘์˜ ๊ฒฝ์šฐ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค‘๋ณต ์œ ํ˜• null์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ ์šฉ๋˜์ง€ ์•Š๊ณ  ์ฝ”๋”ฉ ๋ฐฉ์‹์— ์˜ํ•ด ์ ์šฉ๋˜์–ด์•ผ ํ•จ).

@metaweta , ๋‚ด ์ถ”๋ก ์— --noNullLiteral ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๊ณ  ๋™์ผํ•œ ์ฝ”๋“œ๋กœ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ตœ์†Œํ•œ์˜ ์„ค์น˜ ๊ณต๊ฐ„์œผ๋กœ ๋” ๊ฐ€๋ฒผ์šด ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๋‚ด ์š”์ ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์ด TS์— ๋„๋‹ฌํ•˜๊ณ  2๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ! ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ null์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด string! ๋Š” null์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • noNullsAllowed ์Šค์œ„์น˜๊ฐ€ ์ผœ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  ๊ณณ์—์„œ null์ด์žˆ๋Š” ajax๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์—์„œ json ์กฐ๊ฐ์„ ์–ป์Šต๋‹ˆ๋‹ค. ๋„๋•์  : ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์˜ ๋™์  ํŠน์„ฑ์€ ๊ทธ ์œ„์— ์œ ํ˜• ์ฃผ์„์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@aleksey-bykov ๊ฐ™์€ ํ† ํฐ์œผ๋กœ ์ˆซ์ž ์†์„ฑ x ์žˆ๋Š” ๊ฐœ์ฒด๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์„œ๋ฒ„์—์„œ {"x":"foo"} ๋ฅผ ๋ฐ›์œผ๋ฉด ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์ด๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. . ์ด๋Š” ์„œ๋ฒ„์—์„œ TypeScript ์ด์™ธ์˜ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜์ด์ž ํ”ผํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฒ„๊ฐ€ TypeScript๋กœ ์ž‘์„ฑ๋˜๊ณ  ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ๋‚ด ํ”„๋ŸฐํŠธ ์—”๋“œ ์ฝ”๋“œ์— ๋Œ€ํ•œ .d.ts ํŒŒ์ผ์ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์œ ํ˜• ๊ฒ€์‚ฌ๋Š” ์„œ๋ฒ„๊ฐ€ null์„ ํฌํ•จํ•˜๋Š” JSON์„ ๋ณด๋‚ด์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์— ์žˆ๊ฑฐ๋‚˜ x ์†์„ฑ์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด.

@metaweta , nullable์ด ์•„๋‹Œ ์œ ํ˜•์€ ํ™•์‹คํžˆ ๋˜ ๋‹ค๋ฅธ ์œ ํ˜• ์•ˆ์ „ ์กฐ์น˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ์›์น™์„ ๋ถ€๊ณผํ•จ์œผ๋กœ์จ(์ฝ”๋“œ์—์„œ null ๋ฆฌํ„ฐ๋Ÿด์„ ํ”ผํ•จ) ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ œ์˜ 90%๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋„์›€. ์ด ์กฐ์น˜๋ฅผ ์‹œํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ž์›์ด ์žˆ๋‹ค๊ณ  ํ•ด๋„ ๋‚˜๋จธ์ง€ 10%์˜ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์งˆ๋ฌธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ฌป์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ์ •๋ง๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. null ์—†์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ–๊ณ  ์‹ถ์€ ๋” ๋ฉ‹์ง„ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠน๋ณ„ํ•œ ๊ฒƒ์€ ๋„ˆ๋ฌด ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ์ ˆ์‹คํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Hoare ์˜ 10์–ต ๋‹ฌ๋Ÿฌ ์‹ค์ˆ˜ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. NPE(๋„ ํฌ์ธํ„ฐ ์˜ˆ์™ธ)๋Š” nullable ํ˜•์‹๊ณผ nullable์ด ์•„๋‹Œ ํ˜•์‹์„ ๊ตฌ๋ณ„ํ•˜์ง€ ์•Š๋Š” ํ˜•์‹ํ™”๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ด์–ด์„œ Java 8์€ ์ด์— ๋งž์„œ๊ธฐ ์œ„ํ•ด ํ•„์‚ฌ์ ์œผ๋กœ Optional ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ nullable์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์€ ์ด๋ก ์ ์ธ ๋ฌธ์ œ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—„์ฒญ๋‚œ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ null์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ๋ณ„ํ•œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๋”๋ผ๋„ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ ํ˜• ์‹œ์Šคํ…œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ TS์— ๊ณต์šฉ์ฒด์™€ ์œ ํ˜• ๊ฐ€๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์œ ํ˜• ์‹œ์Šคํ…œ์€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ทธ๊ฒƒ์ด ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์€ TypeScript 2.0์ด ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆฌ๊ธฐ ๋ณด๋‹ค๋Š” ์ด๋ฏธ ์†์ƒ๋œ ์ฝ”๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ ์™ธ๋ถ€์—์„œ null์„ ๋ˆ„์ถœํ•˜๋Š” ํ•จ์ˆ˜(๋Œ€๋ถ€๋ถ„ ์˜๋„์น˜ ์•Š๊ฒŒ) ๋˜๋Š” ํ•ด๋‹น ๋ฉค๋ฒ„๋ฅผ ์ œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค(์ด ๋ถ€๋ถ„)๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜•์‹ ์‹œ์Šคํ…œ์ด ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”๋˜๋Š” ๋ฉค๋ฒ„ ๊ฐ’์„ ํ—ˆ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค).

์ด๊ฒƒ์€ null์„ _์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”_์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ด€๋ จ๋œ ๋ชจ๋“  ์œ ํ˜•์„ ์ ์ ˆํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๊ธฐ๋Šฅ์€ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ null์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋” ์ด์ƒ null์„ ํ”ผํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค! ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋Œ€์ˆ˜์  Maybe ์œ ํ˜•์˜ ํŒจํ„ด ์ผ์น˜์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค(์ผ€์ด์Šค ํ‘œํ˜„์‹์ด ์•„๋‹Œ if ๊ฒ€์‚ฌ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ).

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋‹จ์ง€ null ๋ฆฌํ„ฐ๋Ÿด์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. null ๋ฐ undefined ๋Š” ๊ตฌ์กฐ์ ์œผ๋กœ ๋™์ผํ•˜๋ฏ€๋กœ(ํ•˜๋‚˜์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ•˜๋‚˜์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜/์—ฐ์‚ฐ์ž๊ฐ€ ์—†์Œ) TS์—์„œ ๋‹จ์ผ null ์œ ํ˜•์œผ๋กœ ์ถฉ๋ถ„ํžˆ ์ž˜ ๋ชจ๋ธ๋ง๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@๋ฉ”ํƒ€์›จํƒ€ ,

JavaScript์˜ null ๊ฐ’์€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ •๊ทœ ํ‘œํ˜„์‹๊ณผ JSON์—์„œ ๋‚ ์งœ๋ฅผ ์ง๋ ฌํ™”ํ•  ๋•Œ๋งŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ „ํ˜€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค.

  • DOM๊ณผ์˜ ์ƒํ˜ธ ์ž‘์šฉ์€ null์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  console.log(window.document.getElementById('nonExistentElement')); // null
  • @aleksey-bykov๊ฐ€ ์œ„์—์„œ ์ง€์ ํ–ˆ๋“ฏ์ด ajax ์ž‘์—…์€ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ undefined ๋Š” ์œ ํšจํ•œ JSON ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.
 JSON.parse(undefined); // error
 JSON.parse(null); // okay
 JSON.stringify({ "foo" : undefined}); // "{}"
 JSON.stringify({ "foo" : null}); // '{"foo":null}'

NB: ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๋ฉด undefined ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— undefined ๊ฐ€ ajax๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜๋˜๋Š” ์ฒ™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด undefined๊ฐ€ ์ง๋ ฌํ™”๋˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฒ„๊ฐ€ TypeScript๋กœ ์ž‘์„ฑ๋˜๊ณ  ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ๋‚ด ํ”„๋ŸฐํŠธ ์—”๋“œ ์ฝ”๋“œ์— ๋Œ€ํ•œ .d.ts ํŒŒ์ผ์ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์œ ํ˜• ๊ฒ€์‚ฌ๋Š” ์„œ๋ฒ„๊ฐ€ null์„ ํฌํ•จํ•˜๋Š” JSON์„ ๋ณด๋‚ด์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์— ์žˆ๊ฑฐ๋‚˜ x ์†์„ฑ์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด.

์ด๊ฒƒ์€ ์™„์ „ํžˆ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ TypeScipt๋กœ ์ž‘์„ฑ๋˜๋”๋ผ๋„ ์˜๊ตฌ ์ €์žฅ์†Œ์—์„œ ์–ป์€ ๋ชจ๋“  ๋‹จ์ผ ๊ฐœ์ฒด์˜ ๋ชจ๋“  ๋‹จ์ผ ์†์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  null์ด ๋„์ž…๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด @aleksey-bykov์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. TypeScript๊ฐ€ null ๋ฐ undefined์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์šฐ๋ฆฌ์—๊ฒŒ ๊ฒฝ๊ณ ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ ˆ๋Œ€์ ์œผ๋กœ ํ›Œ๋ฅญํ•  ๊ฒƒ์ด์ง€๋งŒ, null์˜ ์‹ค์ œ ์†Œ์Šค๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š๋Š” ๋™์•ˆ ์ž˜๋ชป๋œ ํ™•์‹ ์„ ์œ ๋„ํ•˜๊ณ  ์‚ฌ์†Œํ•œ ์žก๋‹ด์œผ๋กœ ๋๋‚ ๊นŒ๋ด ๋‘๋ ต์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ TypeScipt๋กœ ์ž‘์„ฑ๋˜๋”๋ผ๋„ ์˜๊ตฌ ์ €์žฅ์†Œ์—์„œ ์–ป์€ ๋ชจ๋“  ๋‹จ์ผ ๊ฐœ์ฒด์˜ ๋ชจ๋“  ๋‹จ์ผ ์†์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  null์ด ๋„์ž…๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‚ฌ์‹ค nullable์ด ์•„๋‹Œ _for_ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ €์žฅ์†Œ๊ฐ€ null Foo๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ €์žฅ์†Œ์—์„œ ๊ฒ€์ƒ‰๋œ ๊ฐœ์ฒด ์œ ํ˜•์€ Foo๊ฐ€ ์•„๋‹ˆ๋ผ Nullable<Foo>์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Foo๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋˜์–ด ์žˆ๋Š” ๋ฐ˜ํ™˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ null์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ฑ…์ž„์„ _๊ฐ€์ง€๊ณ _ ์žˆ์Šต๋‹ˆ๋‹ค.

nullable์ด ์•„๋‹Œ ์œ ํ˜•์ด ์—†๋‹ค๋ฉด ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ null์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

null์˜ ์‹ค์ œ ์†Œ์Šค๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ž˜๋ชป๋œ ์ž์‹ ๊ฐ์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๊ณ  ์‚ฌ์†Œํ•œ ์ •๋ณด๋ฅผ ์–ป๊ฒŒ ๋ ๊นŒ๋ด ๋‘๋ ต์Šต๋‹ˆ๋‹ค.

nullable์ด ์•„๋‹Œ ์œ ํ˜•์ด ๋†“์น  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์†Œํ•œ ์œ ํ˜•์€ ๋ฌด์—‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์™„์ „ํžˆ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ TypeScipt๋กœ ์ž‘์„ฑ๋˜๋”๋ผ๋„ ์˜๊ตฌ ์ €์žฅ์†Œ์—์„œ ์–ป์€ ๋ชจ๋“  ๋‹จ์ผ ๊ฐœ์ฒด์˜ ๋ชจ๋“  ๋‹จ์ผ ์†์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  null์ด ๋„์ž…๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜๊ตฌ ์ €์žฅ์†Œ๊ฐ€ ์œ ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์ง€์ ์—์„œ๋งŒ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ์ฝ”๋“œ์˜ _๋ชจ๋“ _ ์ „์ฒด์— ๋Œ€ํ•ด ๋ณด์ฆ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด @aleksey-bykov์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. TypeScript๊ฐ€ null ๋ฐ undefined์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์šฐ๋ฆฌ์—๊ฒŒ ๊ฒฝ๊ณ ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ ˆ๋Œ€์ ์œผ๋กœ ํ›Œ๋ฅญํ•  ๊ฒƒ์ด์ง€๋งŒ, null์˜ ์‹ค์ œ ์†Œ์Šค๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š๋Š” ๋™์•ˆ ์ž˜๋ชป๋œ ํ™•์‹ ์„ ์œ ๋„ํ•˜๊ณ  ์‚ฌ์†Œํ•œ ์žก๋‹ด์œผ๋กœ ๋๋‚ ๊นŒ๋ด ๋‘๋ ต์Šต๋‹ˆ๋‹ค.

nullable ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ "๋ฌด์˜๋ฏธํ•œ" ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ํ•ด๋‹น ํ˜•์‹ ์ •์˜์—์„œ nullable ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ•ญ์ƒ ๋™์ผํ•œ ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ์‹คํŒจํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ์–ธ์–ด์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: JetBrains์˜ Kotlin ).

@aleksey-bykov ์†”์งํžˆ ๋งํ•ด์„œ ์™„์ „ํžˆ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. nullable์ด ์•„๋‹Œ ์œ ํ˜•์˜ ๊ฐ€์žฅ ์ข‹์€ ์  ์ค‘ ํ•˜๋‚˜๋Š” _์œ ํ˜•์„ nullable๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค.
null ํฌ์ธํ„ฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด null์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜ ๋„์ž…์— ๋Œ€ํ•œ ๋‘๋ ค์›€์—์„œ null ๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์™„์ „ํžˆ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์™„์ „ํžˆ ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค.

์–ธ์–ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ† ๋ก ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์–ด๋ฆฌ์„์€ ์˜๊ฒฌ๊ณผ ํ•จ๊ป˜ ๊ฐ€์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

nullable์ด ์•„๋‹Œ ์œ ํ˜•์€ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. nullable์ด ์•„๋‹Œ ์œ ํ˜•์€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์“ธ๋ชจ์—†๋Š”! ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์ด ์ •๋ง๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์›น์— ๊ฒŒ์‹œํ•  ๋ชจ๋“  ๊ฒƒ์„ ๋ฌด์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ๊ด€์ ์ด ๋‚˜์˜ ๊ด€์ ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ๊ธฐ๊บผ์ด ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–‰๋™ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค ์–ด๋ฆฐ์ด.

๋‚˜๋Š” null์ด ์•„๋‹Œ ์œ ํ˜•์˜ ์ฃผ์„์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์— ์ „ํ˜€ ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C# ๋ฐ ๊ธฐํƒ€ ์–ธ์–ด์—์„œ ์œ ์šฉํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

OP๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ† ๋ก  ๊ณผ์ •์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ null์ด ์•„๋‹Œ ์‚ฌ์šฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“  null ํฌ์ธํ„ฐ ์˜ˆ์™ธ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€๊ฐ€๋ผ๋ฉด ๋ฌธ์ œ ์—†์ด ์ง€๋ถˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. null ๋˜๋Š” undefined๋ฅผ ๋ชจ๋“  ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์€ ๋‚ด ์ƒ๊ฐ์— typescript๊ฐ€ ๋งŒ๋“  ๋” ๋‚˜์œ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹จ์ง€ ์•ผ์ƒ์—์„œ null ๋ฐ undefined ์˜ ์œ ํ–‰์„ ์ง€์ ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TypeScript์— ๋Œ€ํ•ด ์ง„์ •์œผ๋กœ ๊ฐ์‚ฌํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ์–ธ์–ด์˜ ์ž์œ ๋ฐฉ์ž„์ ์ธ ํƒœ๋„์ž…๋‹ˆ๋‹ค. ์‹ ์„ ํ•œ ๊ณต๊ธฐ๋ฅผ ๋งˆ์‹œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜•์ด ๊ธฐ๋ณธ์ ์œผ๋กœ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ์ •์‹ ์— ์–ด๊ธ‹๋‚ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์™œ ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ํ•„์š”๋กœ ํ•˜๋Š”์ง€/ํ•„์š”ํ•˜์ง€ ์•Š์€์ง€์— ๋Œ€ํ•ด ๋– ๋„๋Š” ์ˆ˜๋งŽ์€ ๋…ผ์Ÿ์„ ๋ณด์•„์™”๊ณ  ์ง€๊ธˆ๊นŒ์ง€ ๋…ผ์˜๋œ ๋ชจ๋“  ๊ธฐ๋ณธ ์‚ฌ๋ก€๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

1) ํ•จ์ˆ˜๊ฐ€ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(์ž…๋ ฅ์ด ์•„๋‹ˆ๋ผ ์‹คํ–‰ ํŒจํ„ด์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•จ).
2) ๊ฐ’์ด null์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
3) ๋ฐ์ดํ„ฐ ๊ฐœ์ฒด์— null ๊ฐ’์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ƒํ™ฉ 2๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, null์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜๊ฐ€ null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ๋ชจ๋“  null์„ ์ œ๊ฑฐํ•˜๋ฉด(์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •) ์‹ค์ œ๋กœ ์ƒํ™ฉ 2๋Š” ์ƒํ™ฉ 1์˜ ๊ฒฐ๊ณผ๋กœ๋งŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํ™ฉ 1 null ๊ฐ’์˜ ์กด์žฌ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ€์žฅ ์ž˜ ํ•ด๊ฒฐ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. _๋„์ด ์•„๋‹Œ ์œ ํ˜•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค_. ํ•จ์ˆ˜์— ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ๊ณ (์˜ˆ: ๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ) null์ด ์•„๋‹Œ ์œ ํ˜•์ด ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌธ์„œ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ ๋” ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜ 2๋„ ์ด๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ํšŒ์‚ฌ์—์„œ ์ผํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํ”„๋กœ์„ธ์Šค์™€ ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜์—ฌ Typescript ํŒ€์ด ์•„๋‹Œ null ์œ ํ˜•์ด ๋งˆํฌ์—…๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ „์ฒด ํƒ€์ดํ•‘ ์‹œ์Šคํ…œ์ด ์˜ตํŠธ์ธ๋˜๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์ด๋ฏ€๋กœ ๋ช…์‹œ์  nullable ์œ ํ˜•์ด opt๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—).

์‹œ๋‚˜๋ฆฌ์˜ค 3์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์˜ ๊ณ„์•ฝ์€ Typescript๊ฐ€ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฐ’์„ null ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ๋งˆํฌ์—…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฐ๊ตญ์—๋Š” typescript์™€ ๋™์ผํ•œ ๋ณด์žฅ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ์ข‹์€ ์ฝ”๋”ฉ ํ‘œ์ค€์ด๋‚˜ ๊ด€ํ–‰์ด ์—†์œผ๋ฉด ์•„๋ฌด ๊ฐ€์น˜๋„ ์—†์Šต๋‹ˆ๋‹ค!

(์ „ํ™”๋กœ ์˜ฌ๋ฆฐ ๊ธ€์ด๋ผ ์˜ค๋ฅ˜ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค)

@fdecampredon , ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‘๋ ค์›€์ด ์•„๋‹ˆ๋ผ null์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๋ณด๋„ˆ์Šค๋กœ null ์ฐธ์กฐ ์˜ˆ์™ธ ๋ฌธ์ œ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ๋นˆ ๊ฒฝ์šฐ์— sum-type์„ ์‚ฌ์šฉํ•˜์—ฌ. ํ•ฉ๊ณ„ ์œ ํ˜•์€ F#, Scala, Haskell ๋ฐ ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด๋ผ๋Š” ์ œํ’ˆ ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ๋ชจ๋“  FP ์–ธ์–ด์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ๋น„์–ด ์žˆ๋Š” ํ•ฉ๊ณ„ ์œ ํ˜•์˜ ํ‘œ์ค€ ์˜ˆ๋Š” F#์˜ Optional ๋ฐ Haskell์˜ Maybe์ž…๋‹ˆ๋‹ค. TypeScript์—๋Š” ADT๊ฐ€ ์—†์ง€๋งŒ ๊ทธ ๋Œ€์‹  ADT์—์„œ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” non-nullable ์ถ”๊ฐ€์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ ๋ฉ”์‹œ์ง€๋Š” ADT์— ๋Œ€ํ•ด non-nullable์„ ๋ฒ„๋ฆฌ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@spion , ๋‚˜์œ ์†Œ์‹: F#์— null์ด ์žˆ์Šต๋‹ˆ๋‹ค(.NET์˜ ๋ ˆ๊ฑฐ์‹œ๋กœ). ์ข‹์€ ์†Œ์‹: ์•„๋ฌด๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. null์ด ์žˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ์„ ํƒ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค (๋‹น์‹ ์ด ์–ธ๊ธ‰ ํ•œ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ Java์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ). ๋”ฐ๋ผ์„œ ๋” ๋‚˜์€ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด null์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๊ถ๊ทน์ ์œผ๋กœ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. null(null์ด ์•„๋‹Œ)์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ์กด์žฌํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ๊ณ , ADT๋ฅผ ์–ธ์–ด ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.

์šฐ๋ฆฌ๋Š” null์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด ํšŒ์‚ฌ ์†Œ์Šค ์ฝ”๋“œ๋Š” ๋‘ ๋ถ€๋ถ„์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

1) ๋ฐ์ดํ„ฐ(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€)์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ null์„ ๊ณต๋ฐฑ ๋ฐ์ดํ„ฐ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

2) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ€๋Šฅํ•œ ๊ฐœ์ฒด์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฐœ์ฒด๋Š” null์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐœ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š” ์†Œ์Šค ์ฝ”๋“œ์— ๋ฒ„๊ทธ์™€ ํ—ˆ์ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. undefined๋Š” ์†Œ์Šค ์ฝ”๋“œ์— ๋ฒ„๊ทธ๋‚˜ ํ—ˆ์ ์ด ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

null ํ—ˆ์šฉ์„ ์›ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋Š” ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ null ๋ฌธ๊ตฌ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

@aleksey-bykov typescript ์—๋Š” ๊ณต์šฉ์ฒด ์œ ํ˜•

๋‹ค๋ฅธ ์ชฝ ๋์—๋Š” null ๊ฐ’์„ ์ œ์™ธํ•˜๋Š” ๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— null์ด ์•„๋‹Œ ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@fdecampredon , TS์—๋Š” ADT๊ฐ€ ์—†๊ณ  ํ•ฉ ์œ ํ˜•์ด ์•„๋‹Œ ๊ณต์šฉ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด 1. ๋‹จ์œ„ ์œ ํ˜•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋นˆ ์ผ€์ด์Šค๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 2. ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ ํ•ด์ œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์„

ADT์— ๋Œ€ํ•œ ํŒจํ„ด ์ผ์น˜๋Š” ์ƒ์„ฑ๋œ JavaScript์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์ •๋ ฌ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด ์ธ์ˆ˜๊ฐ€ ์ „ํ™˜์ ์ด ์•„๋‹ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@aleksey-bykov ์ด๊ฒƒ์€ F#์ด ์•„๋‹™๋‹ˆ๋‹ค. JavaScript ์œ ํ˜•์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค. JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” null ๋ฐ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๊ฐ’์€ ์ ์ ˆํ•œ ์œ ํ˜•์œผ๋กœ ๋ชจ๋ธ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ES6์กฐ์ฐจ๋„ ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— TypeScript์˜ ์„ค๊ณ„ ๋ชฉํ‘œ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ํ•ด๋‹น ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ JavaScript ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŒจํ„ด ์ผ์น˜ ๋Œ€์‹  if ๊ฒ€์‚ฌ(typeof ๋ฐ ๋™๋“ฑ์„ฑ ํ…Œ์ŠคํŠธ์™€ ํ•จ๊ป˜)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ์ด๋ฏธ TypeScript ๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์ขํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ๋Œ€์ˆ˜์  Maybe ๋“ฑ๊ณผ ๋น„์Šทํ•œ ์ด์ ์„ ๊ฐ€์ง„ nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์ž‘์€ ๋‹จ๊ณ„์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

lib.d.ts ์— ๋„์ž…ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋Š” ์—„์ฒญ๋‚œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์ค‘ ํด๋ž˜์Šค ํ•„๋“œ์˜ ์ผ์‹œ์ ์ธ null ์ƒํƒœ์˜ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์•„๋ฌด๋„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ด๋Š” nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์ œ์ ์ด๊ณ  ์‹ค์ œ์ ์ธ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค...

@Griffork ์•„์ด๋””์–ด๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“  ๊ณณ์—์„œ null ๊ฒ€์‚ฌ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

declare function getName(personId:number):string|null;

์•„์ด๋””์–ด๋Š” ์ด๋ฆ„์ด null์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ•œ ๋ฒˆ๋งŒ ํ™•์ธํ•˜๊ณ  null ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑฑ์ • ์—†์ด ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

function doSomethingWithPersonsName(personId:number) {
  var name = getName(personId);
  if (name != null) return doThingsWith(name); // type guard narrows string|null to just string
  else { return handleNullCase(); }
}

์ด์ œ ๋‹น์‹ ์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค! ์œ ํ˜• ์‹œ์Šคํ…œ์€ doThingsWith ๊ฐ€ null์ด ์•„๋‹Œ ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

function doThingsWith(name:string) {
  // Lets create some funny versions of the name
  return [uppercasedName(name), fullyLowercased(name), funnyCased(name)]
}

์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” null์„ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ฝ”๋“œ๋Š” throw ์—†์ด ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์— nullable ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์ฆ‰์‹œ ์˜ค๋ฅ˜๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

function justUppercased(personId:number) {
  var name = getName(personId);
  return uppercasedName(name); // error, passing nullable to a function that doesn't check for nulls.
}

์ด๊ฒƒ์€ ์—„์ฒญ๋‚œ ์ด์ ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์œ ํ˜• ์‹œ์Šคํ…œ์€ ํ•จ์ˆ˜๊ฐ€ nullable ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•˜๊ณ  ๋” ๋‚˜์•„๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ๊นจ๋—ํ•œ ์ฝ”๋“œ, ๋” ์ ์€ ๊ฒ€์‚ฌ, ๋” ๋งŽ์€ ์•ˆ์ „์„ฑ. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋‹จ์ง€ ๋ฌธ์ž์—ด์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ๊ฒ€์‚ฌ ์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

null ๊ฐ’์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋ชจ๋ธ๋งํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ๋Š๋ผ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ์ด์ „์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋™์ž‘์œผ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

declare function getName(personId:number):string;

๊ทธ๋Ÿฐ ๊ฒฝ์šฐ typescript๋Š” ๋ถ„๋ช…ํžˆ ์ž˜๋ชป๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

uppercasedName(null);

์†”์งํžˆ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋‹จ์ ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@jbondc https://github.com/Microsoft/TypeScript/issues/186 ์ด ํ•˜๋‚˜

@fdecampredon Union ์œ ํ˜•์€ ๋ฐ”๋กœ Union์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ _disjoint_ ํ†ตํ•ฉ(ํ•ฉ๊ณ„)์ด ์•„๋‹™๋‹ˆ๋‹ค. #186 ์ฐธ์กฐ.

@aleksey-bykov

์˜ต์…˜ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

// lib.d.ts
interface Document {
    getElementById(id: string): Maybe<Element>;
}

...

// Code that worked with 1.3
var myCanvas = <HTMLCanvasElement>document.getElementById("myCanvas");
// ... now throws the error that Maybe<Element> can't be cast to an <HTMLCanvasElement>

๊ฒฐ๊ตญ Destructuring์„ ํ†ตํ•ด ์ง€๊ธˆ ๊ฐ€๋‚œํ•œ ์‚ฌ๋žŒ์˜ ์˜ต์…˜ ์œ ํ˜•์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Option<T> {
    hasValue: boolean;
    value: T;
}

var { hasValue, myCanvas: value } = <Option<HTMLCanvasElement>> $("myCanvas");
if (!hasValue) {
    throw new Error("Canvas not found");
}
// Use myCanvas here

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์˜ ์œ ์ผํ•œ ๊ฐ’์€ lib.d.ts(๋ฐ ๋‹ค๋ฅธ .d.ts, ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค, ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค)๋„ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์‹œ Option์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋Š” ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ํ•œ null์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ null์ด ์•„๋‹Œ ์œ ํ˜•์„ ์„ ํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(TS 1.x๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Œ). ๋„ˆ๋ฌด ํฐ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ 2.0์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ์–ด์จŒ๋“  ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ต์…˜ ์œ ํ˜• ์ถ”๊ฐ€) ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํ˜•๋„ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํ˜•์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์˜ต์…˜ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ฐฐํƒ€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ›„์ž๋Š” ๋…๋ฆฝํ˜•์ผ ์ˆ˜ ์žˆ์ง€๋งŒ(์˜ˆ: ์ง€์ ํ•œ ๋Œ€๋กœ F#์—์„œ) ์ „์ž๋Š” ํ›„์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@Arnavion , ์•ฝ๊ฐ„์˜ ์˜คํ•ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์„ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ๋ชจ๋“  ์„œ๋ช…์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์„ ์œ„ํ•ด์„œ๋Š” ADT๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์›ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ null์ด ์•„๋‹Œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

ATD๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ๋Š” ๊ฒฝ์šฐ null์ด ๋‹ค์Œ์„ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์œ„์น˜๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž์˜ ๋ชซ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@aleksey-bykov

์„œ๋ช…์„ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋ช…์€ ๋ชจ๋‘ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

_I_๋Š” ์„œ๋ช…์„ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ–ˆ๊ณ  ์ด๋ฏธ ์ด์œ ๋ฅผ ๋ฐํ˜”์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์˜ ์œ ์ผํ•œ ๊ฐ’์€ lib.d.ts(๋ฐ ๋‹ค๋ฅธ .d.ts, ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค, ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค)๋„ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์‹œ Option์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋Š” ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ํ•œ null์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ธฐ๋ณธ์ ์œผ๋กœ null์ด ์•„๋‹Œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ.

TS 1.x์˜ ๊ฒฝ์šฐ ๋„ˆ๋ฌด ํฐ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. 2.0์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์„œ๋ช…(lib.d.ts ๋“ฑ)์—์„œ ์˜ต์…˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํ˜•์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ _๊ทธ ์™ธ์—๋„_ ๊ฐ€์น˜๊ฐ€ ์žˆ์œผ๋ฉฐ ๋‹จ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ต์…”๋„์„ ๋„์ž…ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์•„๋ฌด ๊ฒƒ๋„ ๊นจ์ ธ์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์˜ต์…”๋„์ด๋‚˜ nullable ๋˜๋Š” non-nullable์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ์›ํ•˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ฐฉ์‹์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰๊ฐ์ ์ธ ํ•„์š”์— ์ ํ•ฉํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž์˜ ๋ชซ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ๋‚ด๊ฐ€ Option<number>๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ foo์™€ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ๋ง‰๋Œ€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‚ด๊ฐ€ bar์˜ ๊ตฌํ˜„์„ ๋ณด๊ฑฐ๋‚˜ ๋ฌธ์„œ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ํ•œ bar๊ฐ€ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ™•์‹ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "์ด ํ•จ์ˆ˜๋Š” null์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."? ์ด๊ฒƒ์ด null์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฒŒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ท€ํ•˜์˜ ์˜ˆ์ œ์—์„œ bar ํ•จ์ˆ˜๋Š” ์‹œ๊ฐ„์˜ ๊ตฌ๊ฑธ์—์„œ nullable๋กœ ์•Œ๋ ค์ ธ ์žˆ์—ˆ๊ณ , ์•ฝ 100500๊ฐœ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ ๋ชจ๋‘๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ nullable๋กœ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‹น์‹ ์€ ์™€์„œ ๋‚ด๋ถ€๋ฅผ ์‚ดํŽด๋ณด๊ณ  null ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ช…์„ nullable์—์„œ non-nullable๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‹น์‹ ์ดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ง€์‹์€ ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ 100500 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ค‘๋‹จํ•  ๊ฐ€์น˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ํ•ด์•ผ ํ•  ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •๋œ ์„œ๋ช…์ด ์žˆ๋Š” ์ƒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

old_lib.d.ts

...
declare function bar(): number; // looks like can return a potentially nullable number
...

์ˆ˜์ •๋œ_lib.d.ts

declare function bar(): !number; // now thank to the knowledge we are 100% certain it cannot return null

์ด์ œ ๊ธฐ์กด ์•ฑ์€ ๊ณ„์† old_lib.d.ts ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์•ฑ์˜ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๋Š” ์ž์œ ๋กญ๊ฒŒ revised_libs.d.ts ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ registered_libs.d.ts์—๋Š” ๋‚ด๊ฐ€ ์•„์ง ๋ณด์ง€ ์•Š์€ 50๊ฐœ์˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฌด์—‡?

์ž, ์‹œ๊ฐ„์„ ๋‚ด์–ด ๋„์›€์„ ์š”์ฒญํ•˜๊ณ  ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(์ง€๊ธˆ๊นŒ์ง€ ์–ป์€ ์ง€์‹ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š” ๋ฒ„์ „ ๋ฒˆํ˜ธ๋กœ ์ ์ง„์ ์œผ๋กœ ๋ฆด๋ฆฌ์Šคํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค: revised_lib.v-0.1.12.d.ts ).

์‹ค์ œ๋กœ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ช…์—์„œ๋Š” nullable ํ˜•์‹์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๊ตฌํ˜„์—์„œ๋Š” nullable์ด ์•„๋‹Œ ํ˜•์‹์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ์ž์— ์˜ํ•œ ์ค‘๋ณต ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ „์„ ์œ„ํ˜‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์  ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์— ! ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ๋‹น์‹ ์ด ๊ทธ๋“ค์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํŒฌ์ด ์•„๋‹ˆ๋‹ค! ์ž…๋ ฅํ•ด์•ผ ํ•  ์ง์ด ๋” ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(ํ‚ค ์ž…๋ ฅ๊ณผ ์‚ฌ์šฉ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋Š” ์ธก๋ฉด ๋ชจ๋‘์—์„œ). 1.x์—์„œ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์›ํ•˜๋ฉด ! ์€ ์ด๋ฏธ ์œ„์—์„œ ๋…ผ์˜ํ•œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜์ด์ง€๋งŒ 2.0์—์„œ ๊ถ๊ทน์ ์ธ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๊ณ  null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์—ฌ์ „ํžˆ ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— Python 2/3๊ณผ ์œ ์‚ฌํ•œ ์ƒํ™ฉ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ TS 2.0์œผ๋กœ ๋ช‡ ๋…„ ๋™์•ˆ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ์•Š๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํด๋ž˜์Šค๊ฐ€ ๋ฉค๋ฒ„ ๋ฐ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ...๋Š” ?๋กœ ์ฃผ์„ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. null์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ. 2to3(Python 2 to 3 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋„๊ตฌ)์กฐ์ฐจ๋„ ์ด์™€ ๊ฐ™์€ ๊ด‘๋ฒ”์œ„ํ•œ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

2.0์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” TS ํŒ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฐฌ์„ฑํ‘œ๋ฅผ ๋˜์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๋ฐฑ๋งŒ ์ค„์งœ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ ์ œ ํˆฌํ‘œ๋Š” ๊ณ„์‚ฐ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” Funscript ์‚ฌ๋žŒ๋“ค์—๊ฒŒ F#๊ณผ null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” DOM API๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฌผ์–ด๋ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(Funscript๋Š” F# ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด TypeScript์˜ lib.d.ts ๋ฐ ๊ธฐํƒ€ .d.ts๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค). ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•œ ์ ์ด ์—†์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด http://funscript.info/samples/canvas/index.html ์„ ๋ณด๋ฉด ์œ ํ˜• ๊ณต๊ธ‰์ž๊ฐ€ document.getElementsByTagName("canvas")[0]์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฐพ์œผ์‹œ๋Š” ์ฃผ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์—ฌ๊ธฐ document.getElementById()๊ฐ€ null์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ฒฐ๊ณผ์—์„œ .onlick์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ๋•Œ Option<Element>๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@spion
๊ณ ๋งˆ์›Œ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค.

์ง์žฅ์—์„œ ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์ž‘์ง€ ์•Š์œผ๋ฉฐ, ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๋Š” ์ด ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๋Š” ์šฐ๋ฆฌ๋ฅผ ์•„์ฃผ ์ ์€ ์ด๋“์œผ๋กœ ๋งŽ์€ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข‹์€ ํ‘œ์ค€๊ณผ ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ๋ช…ํ™•ํ•œ ์˜์‚ฌ ์†Œํ†ต์„ ํ†ตํ•ด null์ด ํ‘œ์‹œ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ณณ์— null์ด ํ‘œ์‹œ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ์‹ฌํ•˜๊ฒŒ ๋ฐ€๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ์†”์งํžˆ ๋†€๋ž์Šต๋‹ˆ๋‹ค.
๋งํ•  ํ•„์š”๋„ ์—†์ด ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์•„์ฃผ ์ ์€ ์ด์ต์„ ์ค„ ๊ฒƒ์ด๊ณ  ์šฐ๋ฆฌ์—๊ฒŒ ๋งŽ์€ ์‹œ๊ฐ„์„ ์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Griffork ๋Š” ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์–ผ๋งˆ๋‚˜ ํฐ ์ด์ ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ์ถ”์ •ํ•˜๊ธฐ ์œ„ํ•ด typescript ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํ•„ํ„ฐ๋ง๋œ ๋ฌธ์ œ ๋ชฉ๋ก์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋งํฌ์— ๋‚˜์—ด๋œ ๋ชจ๋“  "์ถฉ๋Œ" ๋ฒ„๊ทธ๋Š” nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋†€๋ผ์šด Microsoft ์ˆ˜์ค€์˜ ํ‘œ์ค€, ํ†ต์‹  ๋ฐ ์ฝ”๋“œ ๊ฒ€ํ† ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์†๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ธฐ์กด ์œ ํ˜• ์ •์˜๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ๋ฐ ๋ˆ„์ถœ๋˜๋Š” ํ•„๋“œ๋ฅผ ์ง€์ ํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, ํŠนํžˆ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋“œ์˜ ์ƒ์„ฑ์ž์—์„œ ํด๋ž˜์Šค ํ•„๋“œ๊ฐ€ ์ข…์ข… ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ๋Š” ๊ฒฝ์šฐ(๋‚˜์ค‘์— ์ดˆ๊ธฐํ™”๋ ) ๋งŽ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚˜๋Š” ๋‹น์‹ ์˜ ์šฐ๋ ค๋ฅผ ์ดํ•ดํ•˜๋ฉฐ TS 1.x์— ๋Œ€ํ•œ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ์„ ์ถ”์ง„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์„ค๋“ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์–ด์จŒ๋“  Facebook์˜ Flow ์—๋Š” nullable์ด ์•„๋‹Œ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์„ฑ์ˆ™ํ•ด์ง€๋ฉด ์ด ๋ฌธ์ œ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด TS๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์กฐ์‚ฌํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@spion , ๊ท€ํ•˜์˜ ๋ชฉ๋ก์ด ์šฐ๋ฆฌ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์œ ์ผํ•œ ์ˆซ์ž๋Š” null ๋˜๋Š” undefined๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ ์–ธ๊ธ‰๋œ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.

@aleksey-bykov ์ €๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง๋œ ๋ชฉ๋ก์˜ _๋ชจ๋“ _ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด์•˜๊ณ  ๊ทธ ์•ˆ์— "crash"๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์ œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์†์„ฑ ๋˜๋Š” ๋ฉ”์„œ๋“œ์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ์Šคํƒ ์ถ”์ ๊ณผ ๊ด€๋ จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ null ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๋กœ ํ•„ํ„ฐ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๊ณ  (๋‚˜๋Š”) ๋ชจ๋“  ํ‚ค์›Œ๋“œ

@spion
์งˆ๋ฌธ: ๋ณ€์ˆ˜๋ฅผ nullable ๋˜๋Š” undefinable๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š” ์œ„์น˜์—์„œ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

EG ๊ฐœ์ฒด์— ๋ถ€๋ชจ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ๋ถ€๋ชจ๋ฅผ null๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ํ•ญ์ƒ ๋ถ€๋ชจ๊ฐ€ null์ธ ํ•˜๋‚˜์˜ ๊ฐœ์ฒด๋ฅผ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ถ€๋ชจ๋ฅผ null ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฃจํ”„๊ฐ€ null ๋ถ€๋ชจ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ ์ค‘๋‹จ๋œ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์–ธ์–ด์— null์ด ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ, undefined ์—์„œ๋„ ๋˜‘๊ฐ™์€ ์ผ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค .

null์„ ์ง€๊ธˆ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์œ ์ง€ํ•˜๋Š” ์ด์œ :
โ€ข ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.
. 1) ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค(์šฐ๋ฆฌ ์ฝ”๋“œ๋Š” ๋งค์šฐ ์„ฑ๋Šฅ์ด ์ข‹์•„์•ผ ํ•จ)
. 2) for in ๋ฃจํ”„๊ฐ€ ๊ฐ์ฒด์—์„œ ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
. 3) ๋นˆ ๊ฐ’(๊ฒฐ์ธก๊ฐ’๊ณผ ๋ฐ˜๋Œ€)์— null์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐฐ์—ด ์‚ฌ์šฉ์ด ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. delete array[i] ๋ฐ array[i] = undefined ๋Š” indexOf(๋ฐ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์ธ๊ธฐ ์žˆ๋Š” ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹ค๋ฅธ ๋™์ž‘์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

null์„ ๋งŒ๋“  ๊ฒฐ๊ณผ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ๋งˆํฌ์—…์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
โ€ข null ์˜ค๋ฅ˜ ๋Œ€์‹  ์ •์˜๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์˜ typescript ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋ฐœ์ƒํ•จ).

๋‚ด๊ฐ€ null ์ด์Šค์ผ€์ดํ”„์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ๋งํ–ˆ์„ ๋•Œ null๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” null์ด ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ •์˜๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ์œ„์น˜์—์„œ ์—ฌ์ „ํžˆ null ์˜ˆ์™ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(Typescript ํŒ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค). ). null์„ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ (์ถ”๊ฐ€ ๊ตฌ๋ฌธ์„ ์š”๊ตฌํ•˜์—ฌ) ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž(์˜ˆ: ์šฐ๋ฆฌ)์—๊ฒŒ ๋” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

null์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์€ null์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ ๊ตฌ๋ฌธ์„ ๊ธฐ์–ตํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋™์•ˆ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๋ฐ ๊ฐ€์šด๋ฐ ์˜ค๋ฅ˜๋ฅผ ๋ช‡ ์ฃผ/๋‹ฌ ๋™์•ˆ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋ฏธ๋ž˜์— ์‹ค์ˆ˜ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ญ”๊ฐ€ ์•ฝ๊ฐ„ ์ž˜๋ชป ์ฃผ์„์„ ๋‹ค๋Š” ๊ฒƒ). [์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ์‹ซ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์–ธ์–ด๊ฐ€ ๋œ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.]

null์ด undefined๊ฐ€ ์•„๋‹Œ ์˜ค๋ฅ˜๋‚˜ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์ƒํ™ฉ์„ ๋‚˜์—๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋‚˜๋Š” null์„ undefined๋ณด๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ ํ›จ์”ฌ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์œ ์Šค ์ผ€์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ ๋„์›€

๊ฒฐ๋ก :
์ •์˜๋˜์ง€ ์•Š์€ ์œ ํ˜•์„ ์ •์˜ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์—์„œ nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ์ •์˜๋˜์ง€ ์•Š์€ ์œ ํ˜•์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@Griffork๋Š” nullable์ด ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•  ๋•Œ nullable ๋˜๋Š” undefined๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  JS๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์œ ํ˜• ๊ฐ€๋“œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๊ธฐ์—์„œ ํ˜๋Ÿฌ๋‚˜์˜ค๋Š” ๊ฐ’์ด ๋” ์ด์ƒ null์ด๊ฑฐ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋„ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ €๋Š” Facebook Flow์˜ ๊ตฌํ˜„ ์„ ์ถฉ๋ถ„ํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฆ๊ฑฐ๋กœ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ๋” ์–ด๋ ค์›Œ์ง€๋Š” _only_ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜์— ์ผ์‹œ์ ์œผ๋กœ null์„ ํ• ๋‹นํ•œ ๋‹ค์Œ null์ด ์•„๋‹Œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ๋จผ์ € ์ดˆ๊ธฐํ™”ํ•˜๋ฏ€๋กœ null์„ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๊นจ์ง€๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ์ด๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹Œ ๋ฆฌํŒฉํ„ฐ๋ง์ž…๋‹ˆ๋‹ค.

@spion
๋‚˜๋Š” ๋งˆ์นจ๋‚ด ๋‹น์‹ ์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ฐ’์ด null์ด ๋  ์ˆ˜ ์—†๋Š” ๋•Œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์›ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ๋‚ด๋ถ€์—์„œ null์„ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณดํ˜ธํ•˜๋Š” if-๋ฌธ์ด ์ œ๊ฑฐ๋˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์œ ์šฉํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ๋‹น์‹ ์ด ๋ฐ”๋ผ๋Š” ์€์ด์•Œ์ด ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ์˜ ๋ชจ๋“  ์ธก๋ฉด์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ณด๋‹ค undefined/null์ด ์žˆ๋Š” ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋” ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์‚ฌ๋žŒ๋“ค์ด ์ž˜๋ชป๋œ ๋ณด์•ˆ ์˜์‹์„ ๊ฐ–๊ฒŒ ๋˜๊ณ  ์‹ค์ œ๋กœ null/์ •์˜๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ถ”์ ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์งˆ๊นŒ ์—ผ๋ ค๋ฉ๋‹ˆ๋‹ค.
์ •๋ง, ๋‹น์‹ ์ด ํ•„์š”๋กœ ํ•˜๋Š” ์†”๋ฃจ์…˜์€ ์•ฝ์†์„ ์ดํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์œ ํ˜•์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Javascript์—์„œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” Typescript๋ฅผ ์ง€์›ํ•˜๋Š” ์ข‹์€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ ์„ธํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Flow๊ฐ€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ๊ท€ํ•˜์˜ ๋งํฌ๋ฅผ ์ฝ์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๊ด€๋ จ ์‚ฌํ•ญ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

"ํ๋ฆ„์€ ๋•Œ๋•Œ๋กœ ๊ฐœ์ฒด ์†์„ฑ์˜ ์œ ํ˜•์„ ์กฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํ™•์ธ๊ณผ ์‚ฌ์šฉ ์‚ฌ์ด์— ์ค‘๊ฐ„ ์ž‘์—…์ด ์—†์„ ๋•Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์  ์œผ๋กœ ๊ฐœ์ฒด์˜ ์•จ๋ฆฌ์–ด์‹ฑ์€ ์ด๋Ÿฌํ•œ ํ˜•ํƒœ์˜ ์ถ”๋ก  ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๋ณ„์นญ์„ ํ†ตํ•ด ํ•ด๋‹น ์†์„ฑ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ๋กœ ๋ฌดํšจํ™”๋˜๊ณ  ์ •์  ๋ถ„์„์ด ๋ณ„์นญ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค ."

"null๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’๋„ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์€ JavaScript์—์„œ ์–ด๋””์—๋‚˜ ์žˆ์œผ๋ฉฐ ์–ธ์–ด์˜ ์œ ์šฉ์„ฑ์— ์‹ฌ๊ฐํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ ๋Š” ํ”ผํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค[...] Flow๋Š” ์ด ๊ฒฝ์šฐ ์ ˆ์ถฉ์ ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๊ฐœ์ฒด ์†์„ฑ ๋ฐ ๋ฐฐ์—ด ์š”์†Œ ์•ก์„ธ์Šค๋กœ ์ธํ•ด ์ •์˜๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์€ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค ."

์ด์ œ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ๊ณผ null์ด ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๋Š” ์—ฌ์ „ํžˆ ์–ด๋””์—๋‚˜ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฌผ์Œํ‘œ๋Š” ๊ฐ’์ด null์ด ์•„๋‹ˆ๋ผ๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์–ธ์–ด๋Š” Javascript์™€ ๋” ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค(TS๊ฐ€ ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ์—์„œ ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค) ).

์ถ”์‹ 

foo(thing: whatiknowaboutmyobject) {
    if (thing.hidden) {
        delete thing.description;
    }
}

if (typeof thing.description === "string") {
    //thing.description is non-nullable now, right?
    foo(thing);
    //What is thing.description?
    console.log(thing.description.length);
}

TS๋Š” ์ด๋ฏธ ์•จ๋ฆฌ์–ด์‹ฑ ํšจ๊ณผ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค(๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ํ—ˆ์šฉํ•˜๋Š” ๋ชจ๋“  ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ). ์ด๊ฒƒ์€ ์˜ค๋ฅ˜ ์—†์ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค:

function foo(obj: { bar: string|number }) {
    obj.bar = 5;
}

var baz: { bar: string } = { bar: "5" };

foo(baz);

console.log(baz.bar.charAt(0)); // Runtime error - Number doesn't have a charAt method

Flow ๋ฌธ์„œ๋Š” ์™„์ „์„ฑ์„ ์œ„ํ•ด์„œ๋งŒ ์ด๊ฒƒ์„ ๋ช…์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋” ๋‚˜์€ ์˜ˆ.

๋‚ก์€:

์˜ˆ, ํ•˜์ง€๋งŒ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ์„ค์ •ํ•˜๋Š” ์ˆ˜๋‹จ์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ์ˆ˜๋‹จ๋ณด๋‹ค ํ›จ์”ฌ ๋” ํฌ๋‹ค๊ณ  ์ €๋Š” ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ง์€,

mything.mystring = 5; // is clearly wrong.
delete mything.mystring; //is not clearly wrong - this is not quite the equivalent of setting mystring to >undefined.

ํŽธ์ง‘ํ•˜๋‹ค:
์Œ, ์ด ์‹œ์ ์—์„œ๋Š” ์ง€๊ทนํžˆ ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ์ž…๋‹ˆ๋‹ค. ์˜ค๋žซ๋™์•ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ์ด ์ œ์•ˆ์ด ์–ธ์–ด์— ๋„์›€์ด ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‚ฌ๋žŒ๋“ค์„ ์ž˜๋ชป๋œ ๋ณด์•ˆ ์˜์‹์œผ๋กœ ์œ ์ธํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  Typescript(์–ธ์–ด๋กœ์„œ์˜)๋ฅผ Javascript์—์„œ ๋ฉ€์–ด์ง€๊ฒŒ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@Griffork ํ˜„์žฌ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹น์‹ ์„ ์ž˜๋ชป๋œ ๋ณด์•ˆ ๊ฐ๊ฐ์— ๋น ์ง€๊ฒŒ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ๋ณด๋ ค๋ฉด ๋†€์ดํ„ฐ์—์„œ ์ œ์‹œํ•œ ์˜ˆ๋ฅผ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

var mything = {mystring: "5"}; 
delete mything.mystring;
console.log(mything.mystring.charAt(1));

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์‚ญ์ œ ์—ฐ์‚ฐ์ž๋Š” null ์œ ํ˜•์˜ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ์—๋„ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์–ธ์–ด๊ฐ€ JavaScript์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ๊ฒƒ์ด๋ผ๋Š” ์ฃผ์žฅ์€ ์‚ฌ์‹ค์ด์ง€๋งŒ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. TypeScript์—๋Š” ์ด๋ฏธ JavaScript์™€ ๋‹ค๋ฅธ ๋™์ž‘์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ์š”์ ์€ ํ•ญ์ƒ ๋ง์ด ์•ˆ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ๋ชจ๋ธ๋งํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ œํ•œ ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— null ๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋ฌธ์ž์—ด ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— ์ˆซ์ž๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. JS๋Š” ๋‘˜ ๋‹ค ํ—ˆ์šฉํ•˜์ง€๋งŒ TS๋Š” ๋‘˜ ๋‹ค ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@spion

์•„์ด๋””์–ด๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“  ๊ณณ์—์„œ null ๊ฒ€์‚ฌ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜๊ฐ€ ์˜นํ˜ธํ•˜๋Š” ๋‚ด์šฉ์„ ์ดํ•ดํ•œ๋‹ค๋ฉด:

A. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์œ ํ˜•์„ null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
B. nullable์ธ ํ•„๋“œ์™€ ๋ณ€์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
C. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ง„์ž…์ ์„ ํ™•์ธํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ž์‹ ์˜ ์ฝ”๋“œ์— null์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฑ…์ž„์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์žˆ์Œ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ "dw, ๋‚˜๋Š” ์‹œ์Šคํ…œ์— ์–ด๋–ค null๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์•ˆ์€ null์ด ์–ด๋””์—๋‚˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ ๊ฒฝ์“ฐ์ง€ ๋ง๊ณ  null์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์—†๋Š” ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ํ›„์ž์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ null ์ฐธ์กฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ๋” ์‚ฌ์‹ค์ ์ž…๋‹ˆ๋‹ค. ์™€์ด์–ด(์˜ˆ: ajax)๋ฅผ ํ†ตํ•ด ์–ป์€ ๊ฐ์ฒด์˜ ํ•„๋“œ๊ฐ€ null์ด ์•„๋‹Œ ์ฒ™ํ•˜๋Š” ๊ฒƒ์€ God :smiley: ์— ๋Œ€ํ•œ ๋ฏฟ์Œ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—… ์ค‘์ธ ํ•ญ๋ชฉ์— ๋”ฐ๋ผ ์œ„์˜ C ํ•ญ๋ชฉ์ด ์‚ฌ์†Œํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ํฐ ์ด๊ฒฌ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@jbondc ๋ฌผ์–ด๋ด ์ฃผ์…”์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ CallExpression์€ ์ •์˜๋˜์ง€ ์•Š์Œ ๋˜๋Š” nullable๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ ํ˜• ์‹œ์Šคํ…œ์€ ํ˜„์žฌ ์ด๋ฅผ ํ™œ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. typeArguments ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ž‘์—…์ด null์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ์ „ํžˆ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ nullable์ด ์•„๋‹Œ ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ํ˜•์„ NodeArray<TypeNode>|null ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์œ ํ˜• ์‹œ์Šคํ…œ์€ null ๊ฒ€์‚ฌ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ํ•œ ํ•ด๋‹น ํ•„๋“œ์— ๋Œ€ํ•œ ์ž‘์—…์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

if (ce.typeArguments != null) {
  callSomethingOn(ce.typeArguments)
}

// callSomethingOn doesn't need to perform any checks

function callSomethingOn(na:NodeArray<TypeNode>) {
...
}

TS 1.4 ์œ ํ˜• ๊ฐ€๋“œ์˜ ๋„์›€์œผ๋กœ if ๋ธ”๋ก ๋‚ด์—์„œ ํ‘œํ˜„์‹์˜ ์œ ํ˜•์ด NodeArray<TypeNode> ๋กœ ์ขํ˜€์ง€๋ฉฐ ํ•ด๋‹น ์œ ํ˜•์— ๋Œ€ํ•œ ๋ชจ๋“  NodeArray ์ž‘์—…์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ด๋‹น ๊ฒ€์‚ฌ ๋‚ด์—์„œ ํ˜ธ์ถœ๋œ ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ๋” ์ด์ƒ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ์ธ์ˆ˜ ์œ ํ˜•์„ NodeArray<TypeNode> ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์“ฐ๋ ค๊ณ  ํ•˜๋ฉด

function someOtherFunction(ce: CallExpression) {
  callSomethingOn(ce.typeArguments)
}

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ด์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๊ณ  ๋ฒ„๊ทธ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, @NoelAbrahams , ์ด๊ฒƒ์€ ๋ชจ๋“  ๊ฒƒ์„ ํ™•์‹คํžˆ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ€์ˆ˜ ๋˜๋Š” ํ•„๋“œ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์•Œ๋ ค์ฃผ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์™ธ๋ถ€ ๊ฐ’์˜ ๊ฒฝ์šฐ ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ์œ ํ˜•์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์˜ ๋ชซ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ์—๋Š” ์ˆซ์ž ๋Œ€์‹  ๋ฌธ์ž์—ด์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ถˆํ‰ํ•˜์ง€ ์•Š์ง€๋งŒ ์ˆซ์ž์— ๋Œ€ํ•ด ๋ฌธ์ž์—ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ํ”„๋กœ๊ทธ๋žจ์ด ์ถฉ๋Œํ•œ๋‹ค๊ณ  ํ•ญ์ƒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ nullable์ด ์•„๋‹Œ ์œ ํ˜•์ด ์—†์œผ๋ฉด ๊ฐ’์ด null์ผ ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค. null ๊ฐ’์€ ๋ชจ๋“  ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด์— ๋Œ€ํ•ด ์ œํ•œ์„ ๋‘˜ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘˜ ์ˆ˜ ์žˆ์œผ๋ฉฐ undefined ๋Š” ๋ชจ๋“  ์œ ํ˜•์— ์œ ํšจํ•œ ๊ฐ’์ด๋ฏ€๋กœ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— null ๋ฐ ์ •์˜๋˜์ง€ ์•Š์€ ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ์žก๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

nullable์ด ์•„๋‹Œ ์œ ํ˜•์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์˜คํ•ด๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘˜ ์ˆ˜ ์—†๊ฑฐ๋‚˜ null ๋˜๋Š” undefined ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆซ์ž์— ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ •๋ง๋กœ ์•„๋ฌด๋ฐ๋„ ๊ฐ€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๊ณ  ๋Š๋ผ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‚˜์˜ ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๋ฌผ์ž…๋‹ˆ๋‹ค. ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ "์‹ญ์–ต ๋‹ฌ๋Ÿฌ์˜ ์‹ค์ˆ˜" ๋™์˜์ƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ ๋งŽ์€ ํ˜„๋Œ€ ์–ธ์–ด์™€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@spion , ์œ ํ˜•์ด null์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ด์ ์— ๋Œ€ํ•ด ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์งˆ๋ฌธ์€ ์œ ํ˜•์ด _ ๊ธฐ๋ณธ์ ์œผ๋กœ _ null์ด

์™€์ด์–ด(์˜ˆ: ajax)๋ฅผ ํ†ตํ•ด ์–ป์€ ๊ฐ์ฒด์˜ ํ•„๋“œ๊ฐ€ null์ด ์•„๋‹Œ ์ฒ™ํ•˜๋Š” ๊ฒƒ์€ ์‹ ์— ๋Œ€ํ•œ ๋ฏฟ์Œ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ์ฒ™ ํ•˜์ง€๋งˆ. nullable๋กœ ํ‘œ์‹œํ•˜๋ฉด nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™•์‹ ํ•˜๋Š”. ํ•„๋“œ๋ฅผ nullable๋กœ ํ‘œ์‹œํ• ์ง€(ํ•„๋“œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ null์ด ์•„๋‹Œ ์‹œ์Šคํ…œ์—์„œ) ๋˜๋Š” ํ•„๋“œ๋ฅผ non-nullable๋กœ ํ‘œ์‹œํ• ์ง€(ํ•„๋“œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ธ ์‹œ์Šคํ…œ์—์„œ)๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์žฅ์€ ์ „์ž๊ฐ€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์ค‘์š”ํ•˜๊ฑฐ๋‚˜ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ)์ด๋ฉฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ชจ๋“  ์ง„์ž…์ ์„ ํ™•์ธํ•˜๊ณ  ๋ณด์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@NoelAbrahams ๊ธฐ๋ณธ์ ์œผ๋กœ null์„ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋ฉฐ ์ง„์ž…์ ์ด null ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ null์ด ์•„๋‹Œ ์œ ํ˜•์˜ ์œ ํ˜• ์‹œ์Šคํ…œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ถ€ API/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ง„์ž…์ ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— null ๊ฒ€์‚ฌ๋ฅผ ๋œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

nullable ํ˜•์‹ ์‹œ์Šคํ…œ์—์„œ ํ˜•์‹์„ null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ฐ’์ด ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ฐ•์ œ๋กœ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š๊ณ ๋„ nullable ํ˜•์‹ ๋ณ€์ˆ˜/๋ฐ˜ํ™˜ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ž˜ ์„ค๊ณ„๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” null์ด๋‚˜ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ •์˜ ์ž‘์„ฑ์ž๋Š” ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐœ๋…์กฐ์ฐจ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. nullable ํ˜•์‹์ด ์•„๋‹Œ ํ˜•์‹ ์‹œ์Šคํ…œ์—์„œ nullable ํ˜•์‹์€ ๊ณต์šฉ์ฒด ํ˜•์‹์œผ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ?string ๋Š” string | null | undefined . nullable ํ˜•์‹์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ˜•์‹ ์‹œ์Šคํ…œ์—์„œ ํ˜•์‹์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ !string ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ• ๊นŒ์š”? string - null - undefined ?

๊ฒฐ๊ตญ ๋‚˜๋Š” ์—ฌ๊ธฐ ์‚ฌ๋žŒ๋“ค์˜ ์šฐ๋ ค๋ฅผ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. null ๋Š” ๋ฌธ์ž์—ด์ด ์•„๋‹™๋‹ˆ๋‹ค. 5 ๊ฐ€ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‘ ๊ฐ’ ๋ชจ๋‘ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์ด ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๊ณ ,์‹œํ‚ค๋Š” ์Šฌ๋ฆฝ ์ˆ˜ var myString: string = null ๊ฐ™์€ ๊ฒฝํ–ฅ์ด ์˜ค๋ฅ˜๋กœ์ด๋‹ค : var myString: string = 5 .
๋ชจ๋“  ์œ ํ˜•์— null ๋˜๋Š” undefined๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์นœ์ˆ™ํ•œ ๊ฐœ๋…์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‚˜์œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

๋‚ด ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋‚ด๊ฐ€ ์™„์ „ํžˆ ์˜ณ์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์— ๊ทธ๊ฒƒ์„ ๋น„๋‚œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์•˜์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŠน์ • ํ•„๋“œ๋ฅผ nullable๋กœ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ํ™•์‹คํžˆ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

interface Foo {
        name: string;
        address: string|null; /* Nullable */
}

var foo:Foo = new FooClass();
foo.name.toString(); // Okay
foo.address.toString(); // Error: do not use without null check

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

foo.name = undefined; // Error: non-nullable

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉ์‹์„ ๋ฐฉํ•ดํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

number ์—๋„ ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

interface Foo {
        name: string;
        address: string|number; 
}
var foo:Foo = new FooClass();
foo.name.toString(); // Okay
foo.address.slice() // error

foo.name  = 5 // error

๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ JavaScript์—์„œ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ช‡ ๋ฒˆ์ด๋‚˜ ๊ฐ์ฒด์˜ ์†์„ฑ์— ๊ธฐ๊บผ์ด null์„ ํ• ๋‹นํ•ฉ๋‹ˆ๊นŒ?

๋Œ€๋ถ€๋ถ„์˜ ํ•ญ๋ชฉ์ด null๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ ํ•„๋“œ๊ฐ€ ์ด์ œ nullable์ด ์•„๋‹˜์„ ์„ ์–ธํ•˜๋Š” ํ˜•์‹ ๊ฐ€๋“œ์— ์˜์กดํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@fdecampredon
๊ฝค ๋งŽ์Šต๋‹ˆ๋‹ค.

@๊ทธ๋ฆฌํฌํฌ

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ๋“ค์ด null๋กœ ํ‘œ์‹œ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค

๊ทธ๊ฒƒ์ด ๋‚˜์˜ ์ดˆ๊ธฐ ์ƒ๊ฐ์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ์˜ ์ผ๋ถ€ ์„น์…˜์„ ์‚ดํŽด๋ณธ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์„์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

interface MyType {

     name: string;

     /** The date the entry was updated from Wikipedia or undefined for user-submitted content. */
     wikiDate: Date; /* Nullable */
}

ํ•„๋“œ๊ฐ€ nullable์ด๋ผ๋Š” ์•„์ด๋””์–ด๋Š” ์ข…์ข… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  TypeScript๋Š” wikiDate ์•ก์„ธ์Šคํ•  ๋•Œ ์œ ํ˜• ๊ฐ€๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค.

@fdecampredon

foo.name = 5 // error
๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ JavaScript์—์„œ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค์ด์ง€๋งŒ TypeScript๋Š” ์˜๋„์ ์ธ ๊ฒƒ์ด ์•„๋‹˜์„ 100% ํ™•์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด

foo.name = ์ •์˜๋˜์ง€ ์•Š์Œ; // ์„œ๋ฒ„์— ์ด๋ฆ„์„ ๋ณด๋‚ด์ง€ ์•Š์Œ

์™„์ „ํžˆ ์˜๋„์ ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๊ฐ€์žฅ ์ž˜ ๋งž๋Š” ๊ตฌํ˜„์€ ๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์›๋ž˜ ์ œ์•ˆ์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 wikiDate: ?Date;

@NoelAbrahams์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

foo.name = 5 // ์˜ค๋ฅ˜
๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ JavaScript์—์„œ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์‹ค์ด์ง€๋งŒ TypeScript๋Š” ์˜๋„์ ์ธ ๊ฒƒ์ด ์•„๋‹˜์„ 100% ํ™•์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฆ„์„ string ํ•˜๊ณ  string | number ๊ฐ€ ์•„๋‹Œ null ํ—ˆ์šฉ ๊ฐ’์„ ์›ํ•  ๊ฒฝ์šฐ ?string ๋˜๋Š” string | null ( ๊ฑฐ์˜ ๋™๋“ฑํ•ฉ๋‹ˆ๋‹ค)

์šฐ๋ฆฌ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๊ฐ€์žฅ ์ž˜ ๋งž๋Š” ๊ตฌํ˜„์€ ๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์›๋ž˜ ์ œ์•ˆ์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ„ํ‚ค๋‚ ์งœ: ?๋‚ ์งœ;

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํ˜•์ด null์ด ์•„๋‹ˆ๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜๊ณ  ? :)๋กœ nullable์„ ํ‘œ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
?Date ๋Š” Dateย | null | undefined ์™€ ๋™์ผํ•˜๋ฏ€๋กœ ๊ณต์šฉ์ฒด ์œ ํ˜•์ด ๋ฉ๋‹ˆ๋‹ค. :)

์•„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์— ๋™์˜ํ•˜๊ณ  ํŠน์ˆ˜ ์ž…๋ ฅ์—์„œ๋Š” null์ด ์•„๋‹Œ ๊ฒƒ์— ๋™์˜ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค(๊ธฐํ˜ธ๊ฐ€ ํ˜ผ๋™๋จ).

@fdecampredon , ์‹ค์ œ๋กœ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ํ•„๋“œ ๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ nullable๋กœ ํ‘œ์‹œ๋˜๋ฉด ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด ์œ ํ˜• ๊ฐ€๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

var wikiDate: ?Date;

wikiDate.toString(); // error
wikiDate && wikiDate.toString(); // okay

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค:

 var name: string;   // okay
 name.toString();  // if you think that's fine then by all means

์•„๋งˆ๋„ null ๋ฅผ ๊ณต์šฉ์ฒด ์œ ํ˜•์— ๋„์ž…ํ•˜์ง€ ์•Š๊ณ ๋Š” ์ด๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ์˜ˆ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ์˜ณ์Šต๋‹ˆ๋‹ค.

wikiDate && wikiDate.toString(); // okay

๋‹น์‹ ์€ typeguard๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๊ฒฝ๊ณ ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๋ฒˆ์งธ ์˜ˆ๋Š” ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

var name: string;   // okay
name.toString();  // if you think that's fine then by all means

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(nullable๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ๋‹จ์œ„ํ™”๋œ ๋ณ€์ˆ˜). ๋” ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ• ๋‹น์„ ๊ฐ์ง€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var name: string;   // okay
name.toString();  // error because not initialized
var name: string;
if (something) {
  name = "Hello World";
}ย else {
  name = "Foo bar";
}
name.toString();  // no error since name will always be initialized.

์žฅ๋ฒฝ์„ ์–ด๋””์— ๋‘˜์ง€ ์ •ํ™•ํžˆ ๋ชจ๋ฅด์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ผ์ข…์˜ ๋ฏธ๋ฌ˜ํ•œ ์กฐ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@metaweta์—์„œ ์ œ์•ˆํ•œ 'null์ด ์•„๋‹Œ ์‚ฌ์šฉ' ์ง€์‹œ๋ฌธ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€์ด๋ฉฐ 2.0 ์ด์ „์—๋Š” ๋„์ž…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์™œ ์—†๋Š”์ง€:

var string1: string; //this works like typescript does currently, doesn't need type-guarding before use, null and undefined can be assigned to it.
string1.length; //works
var string2: !string; //this doesn't work because the string must be assigned to a non-null and non-undefined value, doesn't need type-guarding before use.
var string3: ?string; //this must be type guarded to non-null, non-undefined before use.
var string4: !string|null = null; //This may be null, but should never be undefined (and must be type-guarded before use).
var string5: !string|undefined; //this may never be null, but can be undefined (and must be type-guarded before use).

๊ทธ๋ฆฌ๊ณ  -noinferrednulls๋ผ๊ณ  ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ(-noimplicitany๊ฐ€ ์ผœ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™)๊ฐ€ ์žˆ์–ด ์œ ํ˜•(์˜ˆ: string ๋ฐ int)์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ๊ตฌ๋ฌธ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ? ๋˜๋Š” ! (null, undefined ๋ฐ ๋ชจ๋“  ์œ ํ˜•์€ ์˜ˆ์™ธ).

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ nullable์ด ์•„๋‹Œ ํ•ญ๋ชฉ์€ ์˜ตํŠธ์ธ์ด๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ null๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(์ด์ „ ์ œ์•ˆ๊ณผ ๊ฐ™์ด) ์ดํ›„๊ฐ€ ์•„๋‹ˆ๋ผ ์œ ํ˜• ํ• ๋‹น ์‹œ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

์ƒ๊ฐ?

ํŽธ์ง‘: ๋ชจ๋“  ์ž‘์—…์—์„œ null์ด ์•„๋‹Œ ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ผ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ TS ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ผœ์ ธ ์žˆ์œผ๋ฉด ๋งค์šฐ ๋ถ„๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค( blah: string ๋Š” ์˜ค๋ฅ˜์ด์ง€๋งŒ blah:!string ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ -noimplicitany ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•จ).

ํŽธ์ง‘2:
๊ทธ๋Ÿฐ ๋‹ค์Œ DefinatelyTyped๋Š” noninferrednull์„ ์ง€์›ํ•˜๋„๋ก ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ? ๊ทธ๋ฆฌ๊ณ  ! ํŠน์ง•.

null์ด ์•„๋‹Œ ๊ฒƒ๊ณผ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์ด ์˜ตํŠธ์ธ, ์˜ตํŠธ์•„์›ƒ์ธ์ง€ ์—ฌ๋ถ€๋Š” ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์œ ํ˜• ์ˆ˜์ •์ž(!?), ์ง€์‹œ๋ฌธ ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ๋‚œ ๋ญ๋“ ์ง€ ํ• ๊ฑฐ์•ผ
๊ทธ๋“ค์ด _ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ_ ๊ทธ๊ฒƒ๋“ค์„ ์–ป๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
ํ˜„์žฌ ์‚ฌ๋ก€.

2014๋…„ 12์›” 22์ผ ์›”์š”์ผ ์˜คํ›„ 2์‹œ 35๋ถ„์— Griffork [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์™œ ์—†๋Š”์ง€:

var string1: ๋ฌธ์ž์—ด; // ์ด๊ฒƒ์€ ํ˜„์žฌ typescript๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์œ ํ˜• ๋ณดํ˜ธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ null ๋ฐ undefined๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์ž์—ด1.๊ธธ์ด; //worksvar string2: !string; // ๋ฌธ์ž์—ด์ด null์ด ์•„๋‹Œ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์— ํ• ๋‹น๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. use.var string3: ?string; //์ด๊ฒƒ์€ use.var string4: !string|null = null; // null์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ์—ฌ์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์œ ํ˜• ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•จ).var string5: !string|undefined; // ์ด๊ฒƒ์€ null์ด ๋  ์ˆ˜ ์—†์ง€๋งŒ ์ •์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์œ ํ˜• ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•จ).

๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(-noimplicitany๊ฐ€ ์ผœ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•จ).
์œ ํ˜•์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ๊ตฌ๋ฌธ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” -noinferrednulls๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค(์˜ˆ:
string ๋ฐ int)๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๊ณ  ? ๋˜๋Š” ! ๊ทธ๋“ค๊ณผ ํ•จ๊ป˜(null, undefined
๋ฐ ์˜ˆ์™ธ).

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ non-nullable์€ ์˜ตํŠธ์ธ์ด๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ•์ œ๋กœ null๋กœ ์ง€์ •ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.
์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ์˜ค๋ฅ˜๋Š” _์œ ํ˜• ์ง€์ •_ ์ดํ›„๊ฐ€ ์•„๋‹ˆ๋ผ(์˜ˆ:
์ด์ „ ์ œ์•ˆ).

์ƒ๊ฐ?

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -67899445
.

๋งˆ์ดํฌ ์Šคํ…Œ์ด - [email protected]
http://www.cs.auckland.ac.nz/~mike
http://reperiendi.wordpress.com

@Griffork ๋Š” ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” ๋‚˜์œ ์˜ต์…˜์ด๋ฉฐ ๊ทธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ •์˜ ํŒŒ์ผ์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  ์œ ํ˜•์— ์˜ฌ๋ฐ”๋ฅธ ์ •์˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“  ๊ณณ์— !string (๋•Œ๋กœ๋Š” ?string )๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ํ›จ์”ฌ ๋–จ์–ด๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์œ ํ˜•์ด nullable์ธ ์‹œ์Šคํ…œ์—์„œ !string ๋Š” ์ด์ƒํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ string minus null minus undefined ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ?string ๋Š” ์„ค๋ช…ํ•˜๊ธฐ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์ด ๊ธฐ๋ณธ์ ์œผ๋กœ null์ธ ์œ ํ˜• ์‹œ์Šคํ…œ string | null | undefined .
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ string | null ์— ์œ ํ˜• ๊ฐ€๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ string ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ดํ•ดํ•˜๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฐพ๋Š” ๋ฐ ๋งŽ์€ ๊ณจ์นซ๊ฑฐ๋ฆฌ(๋ฐ ์„ฑ๋Šฅ ์†์‹ค)๊ฐ€ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐœ๋…์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ณต์šฉ์ฒด ์œ ํ˜•์€ ๋‹ค๋ฅธ ์œ ํ˜•๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์ตœ์•…์˜ ๋ถ€๋ถ„์€ var myString = "hello" myString์ด string , ?string ๋˜๋Š” !string ์—ฌ์•ผ ํ•˜๋Š” var myString = "hello" ์„ ์™„์ „ํžˆ ๋Š์Šจํ•˜๊ฒŒ ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์†”์งํžˆ ์—ฌ๊ธฐ์„œ ๊ด€์ ์—์„œ ๋ณด๋ฉด ํฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์œผ๋กœ null์ด ์•„๋‹Œ ์œ ํ˜•์ด ์—†๋Š” ๊ฒฝ์šฐ ์—ฌ๊ธฐ์—์„œ ๋ณธ ์ตœ๊ณ ์˜ ์ œ์•ˆ์€ @metaweta๊ฐ€ ์ œ์•ˆํ•œ 'use non-null' ์ง€์‹œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ก  ์ž˜ ์ง€์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ชจ๋“  ํŒŒ์ผ์— use non-null ๋ฌธ์ž์—ด

@fdecampredon

  1. ์ •์˜ ํŒŒ์ผ์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ _์–ด์จŒ๋“  ๊ทธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค_(์œ ํ˜•์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด) ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•„์ง ํŽธ์ง‘ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์•Œ๋ ค์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(-noimplicitnull์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ).
  2. ๋‚˜๋Š” ์ฃผ์„์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ œ์•ˆ์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์†”์งํžˆ ํ˜„์žฌ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์ œ์ž๋ฆฌ๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ _๋Œ€์ฒด_๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์ด ์ถ”๊ตฌํ•˜๋Š” ๋ฐ”๋ฅผ ๋” ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ธฐํ˜ธ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์ •๋ง ์ •๋ง ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)
  3. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ์š”์ฒญ(ํŠน์ • ์œ ํ˜•์— ๋Œ€ํ•œ)์ด ์ œ์•ˆ๋œ(๋งˆ์ปค ์—†์ด) typescript์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ํ† ๋ก ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋” ์ฐพ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  4. ๋‚ด๊ฐ€ !string|null ๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ null์ด _like_ {}(ํ•˜์ง€๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Œ) ์ฒ˜๋ฆฌ๋œ ๊ฒฝ์šฐ ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
    ๋‚ด ๋ชฉ๋ก์— ์—†๋Š” string|null ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด ๊ฒฝ์šฐ null์„ ๋ฌด์‹œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Null ๋ฐ undefined๋Š” ๋ชจ๋“  non-null ๋ฐ non-undefined ์•ž์— ! ๊ทธ๋ฆฌ๊ณ  any๋Š” any๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค(์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ /์˜ค๋ฅ˜์ผ ์ˆ˜ ์žˆ์Œ).
  5. ์ข‹์€ ์งˆ๋ฌธ์ด๊ณ  -noimplicitnull ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ์˜ต์…˜์€ ์ดˆ๊ธฐ ์˜ค๋ฅ˜(์•„๋งˆ๋„ null ํ—ˆ์šฉ)๋ฅผ ์œ ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’์€ ์˜ต์…˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ๋” ๋‚˜์€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋‹ค๋Š” ๋Š๋‚Œ. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: 2๋ฒˆ ํ•ญ๋ชฉ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํŽธ์ง‘: 4๋ฒˆ ํ•ญ๋ชฉ์˜ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ •์˜ ํŒŒ์ผ์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด์จŒ๋“  ๊ทธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์œ ํ˜•์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด). ์ด๋ฒˆ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•„์ง ํŽธ์ง‘ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์•Œ๋ ค์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(-noimplicitnull์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ).

์˜ˆ ๋ฐ ์•„๋‹ˆ์˜ค, ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด null ๋˜๋Š” undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
์•„์ฃผ ๋“œ๋ฌธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ์—์„œ ํ‘œ์ค€ lib์— ๋Œ€ํ•ด ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ ˆ๋Œ€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด ์š”์ ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํ˜•์ด null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์กด ์ •์˜ ํŒŒ์ผ์ด ์ด๋ฏธ ์œ ํšจํ•˜๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฃผ์„์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ œ์•ˆ์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ํ˜„์žฌ ์œ ํ˜• ์‹œ์Šคํ…œ์—๋Š” ์ œ์ž๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ต์ฒด๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํš๊ธฐ์ ์ธ ๋ณ€ํ™”๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์— ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์ด ์ถ”๊ตฌํ•˜๋Š” ๋ฐ”๋ฅผ ๋” ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ธฐํ˜ธ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์ •๋ง ์ •๋ง ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” ๊ทธ๋Ÿฐ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋‚ด ์ƒ๊ฐ์— ์ธก๋Ÿ‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ€์น˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ํ‹€๋ ธ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
์ฃผ์š” ๋ณ€๊ฒฝ ๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ 'use non-null' ์ง€์‹œ๋ฌธ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
null ํ—ˆ์šฉ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์›ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์€ (์•„์ง ์ด์ƒํ•˜๊ฒŒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ „ํ˜€ ์˜ํ–ฅ์„๋ฐ›์ง€ ๊ฒƒ 'use non-null' ์ž์‹ ์˜ ํŒŒ์ผ์˜ ์ƒ๋‹จ์— ์žˆ์ง€๋งŒ ์†”์งํžˆ ์กฐ๊ธˆ ... ์ด์ƒํ•œ ๊ฒƒ)
๊ทธ๋ฆฌ๊ณ  null์ด ์•„๋‹Œ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์›ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์ƒˆ ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ์š”์ฒญ(ํŠน์ • ์œ ํ˜•์— ๋Œ€ํ•œ)์ด ์ œ์•ˆ๋œ(๋งˆ์ปค ์—†์ด) typescript์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ํ† ๋ก ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋” ์ฐพ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ฐœ๋…์ด ์•ฝ๊ฐ„ '์ด์ƒํ•˜๊ณ ' ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ _decomposition_์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ์ฃผ์š” ๋„๊ตฌ๋กœ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์™œ ๊ทธ๋ ‡์ง€ ์•Š์€์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ !string|null๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ null์ด {}์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌ๋˜๋ฉด ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Œ). ๋‚ด ๋ชฉ๋ก์— ์—†๋Š” string|null์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด ๊ฒฝ์šฐ null์„ ๋ฌด์‹œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Null ๋ฐ undefined๋Š” ๋ชจ๋“  non-null ๋ฐ non-undefined ์•ž์— ! ๊ทธ๋ฆฌ๊ณ  any๋Š” any๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค(์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ /์˜ค๋ฅ˜์ผ ์ˆ˜ ์žˆ์Œ).
๋‚˜๋Š” ๋‹น์‹ ์ด 3 ๊ฐ€์ง€ ์œ ํ˜•์„ ๋ถ„ํ•ด ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • !sting : string - null - undefined
  • string : string | null | undefined
  • ?string : string | null | undefined

์ตœ์‹  2๊ฐœ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐจ์ด๊ฐ€ ์—†์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” string ๊ฒฝ์šฐ type-guard ๊ฒ€์‚ฌ๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๊ณ  ?string ๊ฒฝ์šฐ ํ•ด๋‹น ์ •๋ณด๊ฐ€ ๋ชจ๋“  ๊ณณ์—์„œ ์ „ํŒŒ๋˜์–ด์•ผ ํ•จ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹ค์ œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ณต์žกํ•  ๊ฒƒ์ด๋ฉฐ ์œ ํ˜• ์ถ”๋ก ์—์„œ ์ด์ƒํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์งˆ๋ฌธ์ด๊ณ  -noimplicitnull ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ์˜ต์…˜์€ ์ดˆ๊ธฐ ์˜ค๋ฅ˜(์•„๋งˆ๋„ null ํ—ˆ์šฉ)๋ฅผ ์œ ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’์€ ์˜ต์…˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ๋” ๋‚˜์€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋‹ค๋Š” ๋Š๋‚Œ. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ null์—์„œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ null๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ @RyanCavanaugh๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋„์ž…ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ ์ „์ž์˜ ์ œ์•ˆ์ด ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ ์™œ 'use non-null' ์ง€์‹œ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒ๋‹ˆ๊นŒ, ์ƒ๊ฐํ• ์ˆ˜๋ก ์ด์ƒ์ ์ธ ์†”๋ฃจ์…˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@fdecampredon
ํ˜„์žฌ ์ œ์•ˆ๋œ "null์ด ์•„๋‹Œ ์‚ฌ์šฉ"์€ ์–ธ์–ด๊ฐ€ _์ž‘์„ฑ๋œ_ ๋ฐฉ์‹์ด ์•„๋‹Œ _์‚ฌ์šฉ๋˜๋Š”_ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•œ ์œ„์น˜์—์„œ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ์ด๋™ํ•  ๋•Œ ํ•จ์ˆ˜๊ฐ€ _์‚ฌ์šฉ_ํ–ˆ์„ ๋•Œ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ์ž˜๋ชป ์ž…๋ ฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž ์žฌ์ ์œผ๋กœ 1-3๊ฐœ ํŒŒ์ผ์— ์žˆ๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ฐจ์ด์ :
string
๊ทธ๋ฆฌ๊ณ 
?string
๊ทธ๊ฒŒ ? ๊ทธ๋ฆฌ๊ณ  ! ๊ธฐํ˜ธ๋Š” ์ด ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค("null์ด ์•„๋‹Œ ์‚ฌ์šฉ" ์ง€์‹œ๋ฌธ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ณ€์ˆ˜๋ณ„๋กœ). ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์„ค๋ช…ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ํฐ ์–ด๋ ค์›€์ด ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํŒŒ์ผ 1:

//...187 lines of code down...
string myfoo(checker: boolean) {
    if(checker){
        return null;
    }
    else {
        return "hello";
    }
}

ํŒŒ์ผ 2:

"use nonnull"
//...2,748 lines of code down...
string myfoo(checker: boolean) {
    if(checker){
        return null; //Error!
    }
    else {
        return "hello";
    }
}

์ด์ œ ๊ฐœ๋ฐœ์ž๋Š” null์ด ์•„๋‹Œ ํŒŒ์ผ๊ณผ null์ด ์•„๋‹Œ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ฉ˜ํƒˆ ๋งต์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์†”์งํžˆ ์ด๊ฒƒ์ด ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์˜ _your_ ์ฝ”๋“œ๊ฐ€ 'null์ด ์•„๋‹Œ ์‚ฌ์šฉ'์ผ์ง€๋ผ๋„).

ํŽธ์ง‘: ๋˜ํ•œ ํ•จ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์ž‘์€ ์ฐฝ์ด ํ‘œ์‹œ๋˜๋ฉด ํ•ด๋‹น ์ •์˜์˜ string ๊ฐ€ nullable์ธ์ง€ ์•„๋‹ˆ๋ฉด nonnullable์ธ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@๊ทธ๋ฆฌํฌํฌ

  • 'use strict' ์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
  • ์ ์–ด๋„ ์•„์ด๋””์–ด๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์— ๊ฐ„๋‹จํ•œ ๊ฐœ๋…์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ํ•จ์ˆ˜๋ฅผ ์ด๋™ํ•˜๋ฉด ๋‚˜์—๊ฒŒ๋Š” ๋งค์šฐ ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด null ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฏ€๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค...

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ํ•˜์ž๋ฉด, ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” (๋ฐ˜๋ก  ์ดํ›„) ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • var mystring = "string" ๋Œ€ํ•œ ๋™์ž‘์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ณณ์— ๊ธฐํ˜ธ๋ฅผ ์ž…๋ ฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ง€์นจ์— ๋Œ€ํ•œ ๋‚˜์˜ ์šฐ๋ ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • null์ด ์•„๋‹Œ ๊ฒƒ์€ ๋ช…์‹œ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ nullable๊ณผ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ). ํŽธ์ง‘ : ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ณ ์ •๋œ ๋ฌธ๊ตฌ.
  • ๊ฐœ๋ฐœ์ž๋Š” ์ž‘์„ฑ ์ค‘์ธ ๋‚ด์šฉ์ด nullable์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ‘œ์‹œ๋˜๋Š” ํ•จ์ˆ˜ ์ •์˜( edit : ํ•จ์ˆ˜ ์ž…๋ ฅ์„ ์‹œ์ž‘ํ•  ๋•Œ Visual Studio์—์„œ ์ œ๊ณตํ•˜๋Š” ํŒ์—…)๋Š” nullable์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ๋งํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜๊ฐ€ 2๊ฐœ ๋˜๋Š” 3๊ฐœ์˜ ๊ณ„์ธต์„ ํ†ตํ•ด ๋ž˜ํ•‘๋˜๋ฉด ํ•ด๋‹น ์ •์˜๊ฐ€ ์—ฌ์ „ํžˆ ์˜ฌ๋ฐ”๋ฅธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค("null์ด ์•„๋‹Œ ์‚ฌ์šฉ"์ด ์—†๋Š” ํŒŒ์ผ์„ ํ†ตํ•ด ์œ ํ˜• ์ถ”๋ก ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—).

์†”์งํžˆ "use strict"์˜ ๊ตฌํ˜„์€ ์—ด๋งํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด
๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์™œ ์ง€์‹œ๋ฌธ์ด ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๊ทธ๋“ค์˜ ์˜๋„๋ฅผ ๋ช…์‹œํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์š”์ ์„ ๋ช…ํ™•ํžˆ ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํŽธ์ง‘: ๋ฌธ์ž์—ด์„ ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ ๋‚ด ๊ด€์‹ฌ์‚ฌ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์š”์•ฝ์€ ์•ฝ๊ฐ„ ์ž‘๊ณ  ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ์œ ํ˜• ์‹œ์Šคํ…œ์— ๋ณต์žก์„ฑ์„ ๋”ํ•˜๊ณ  ์œ ํ˜• ๊ฒ€์‚ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณจ์น˜ ์•„ํ”„๊ฒŒ ๋งŒ๋“ค๋ฉฐ ๋ชจ๋“  ๊ทน๋‹จ์  ์ธ ๊ฒฝ์šฐ๋กœ ์ง€์ •ํ•˜๊ธฐ๊ฐ€ ๊ฝค ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์ถ”๋ก ์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ๋งŒ๋“ค๊ณ  ์ฝ”๋“œ๋ฅผ ๋งค์šฐ ์žฅํ™ฉํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์—…์— ์ ํ•ฉํ•œ ๋„๊ตฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

null์ด ์•„๋‹Œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(nullable๊ณผ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—).

string ๊ฐ€ ์‹ค์ œ๋กœ string | null | undefined ๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ช…์‹œ์ ์œผ๋กœ ํ™•์ธํ•˜๋„๋ก ๊ฐ•์š”ํ•˜์ง€ ์•Š๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ์ž‘์„ฑ ์ค‘์ธ ๋‚ด์šฉ์ด nullable์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ null์ด ์•„๋‹Œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ํŒŒ์ผ ์ƒ๋‹จ์—์„œ ์Šคํฌ๋กคํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์€ ๊ฒฝ์šฐ 'null์ด ์•„๋‹Œ ์‚ฌ์šฉ'์ด ์—†๋Š” ํ”„๋กœ์ ํŠธ์— ๋‹จ์ผ ํŒŒ์ผ์ด ์žˆ์„์ง€ ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค(์ ์–ด๋„ 500์ค„ ๋ฏธ๋งŒ์˜ ์ฝ”๋“œ๋กœ ํŒŒ์ผ์„ ์ž‘์„ฑํ•  ๋•Œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค ...)

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ‘œ์‹œ๋˜๋Š” ํ•จ์ˆ˜ ์ •์˜๋Š” nullable์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ, 'null์ด ์•„๋‹Œ ์‚ฌ์šฉ' ์ง€์‹œ๋ฌธ์ด ์žˆ๋Š” ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒƒ์„ nullable๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์œผ๋ฉด ๊ทธ์— ๋”ฐ๋ผ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค...

ํ•จ์ˆ˜๊ฐ€ 2๊ฐœ ๋˜๋Š” 3๊ฐœ์˜ ๊ณ„์ธต์„ ํ†ตํ•ด ๋ž˜ํ•‘๋˜๋ฉด ํ•ด๋‹น ์ •์˜๊ฐ€ ์—ฌ์ „ํžˆ ์˜ฌ๋ฐ”๋ฅธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค("null์ด ์•„๋‹Œ ์‚ฌ์šฉ"์ด ์—†๋Š” ํŒŒ์ผ์„ ํ†ตํ•ด ์œ ํ˜• ์ถ”๋ก ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—).

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ๋‹น์‹ ์˜ ์š”์ ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์†”์งํžˆ "use strict"์˜ ๊ตฌํ˜„์€ ์—ด๋งํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. JavaScript(Typescript๊ฐ€ ์•„๋‹˜)์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ JavaScript์—๋Š” ๊ท€์ค‘ํ•œ ๋Œ€์•ˆ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Typescript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ผ์„ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์™œ ์ง€์‹œ๋ฌธ์ด ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๊ทธ๋“ค์˜ ์˜๋„๋ฅผ ๋ช…์‹œํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

TypeScript๋Š” JavaScript์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ด๋ฉฐ JavaScript์— ๋ฟŒ๋ฆฌ๋ฅผ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ ๋ชฉํ‘œ๋Š” JavaScript๋ฅผ ๋” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ JavaScript ๊ฐœ๋…์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋น„ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์™œ ์ง€์‹œ๋ฌธ์ด ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๊ทธ๋“ค์˜ ์˜๋„๋ฅผ ๋ช…์‹œํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— nullable ํ˜•์‹ ์‹œ์Šคํ…œ์—์„œ nullable์ด ์•„๋‹Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ง€ ๋‚˜์œ ์ƒ๊ฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ ์—์„œ ์—ฌ๊ธฐ์—๋Š” 3๊ฐ€์ง€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์œ ํ˜•์ด null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” 2.0์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ
  • ๋‚ด๊ฐ€ ์ˆ˜์‹ญ ๊ฐœ์˜ ์ฃผ์„์„ ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด ์•„๋‹Œ ์œ ํ˜•์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ์ด์ง€๋งŒ @RyanCavanaugh ๋Š” ์ด์— ๋Œ€ํ•ด ์ข‹์€ ์ง€์ ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. (์†”์งํžˆ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ)
  • 'null์ด ์•„๋‹Œ ์‚ฌ์šฉ' ์ง€์‹œ๋ฌธ

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๊นƒ๋ฐœ์€ ๋‚˜์—๊ฒŒ ์™„์ „ํžˆ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

function fn(x: string): number;
function fn(x: number|null): string;

function foo() {
    return fn(null);
}

var x = foo(); // x: number or x: string?

ํ•จ์ˆ˜๊ฐ€ ์œ ์ผํ•œ ๊ด€์‹ฌ์‚ฌ์ธ ๊ฒฝ์šฐ ์˜ค๋ฒ„๋กœ๋“œ์— ๋ช…์‹œ์  null ์ธ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•ญ์ƒ ์•”์‹œ์  null๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค( --noImplicitNull ์™€ ์กฐํ™”๋ฅผ ์ด๋ฃจ๊ธฐ ์œ„ํ•ด). . ์ด๊ฒƒ์€ ๋˜ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ํ•ด์„์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ฆ‰, "๋ช…์‹œ์ ์œผ๋กœ ๋งํ•œ ๋‚ด์šฉ์€ ์•”์‹œ์ ์œผ๋กœ ๋งํ•œ ๋‚ด์šฉ๋ณด๋‹ค ์šฐ์„ ํ•ด์•ผ ํ•จ"). ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜์—†๋Š” ํ”Œ๋ž˜๊ทธ์— ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ์‚ฌ์–‘๊ณผ ๊ตฌํ˜„ ๋ชจ๋‘์— ์•ฝ๊ฐ„์˜ ํ•ดํ‚น ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  1. string|null|undefined ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด ์ œ์•ˆ์— ๋ช…์‹œ์ ์ด๋ฏ€๋กœ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ํŒŒ์ผ ๋‹น ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ ์ œ์•ˆ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ์ €์™€ ๋‹ค๋ฅธ ๋งŽ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ค‘์š”ํ•œ _ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ ์ „์ฒด์— ๊ฐ•์ œ๋กœ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋‚ด๊ฐ€ ๋งŒ๋“ค์ง€ ์•Š์€ ํŒŒ์ผ์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํŒŒ์ผ์— "null์ด ์•„๋‹Œ ์‚ฌ์šฉ"์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งŒ๋“  100๊ฐœ์˜ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ 100๊ฐœ์˜ ํŒŒ์ผ ์ค‘ null์ด ์•„๋‹Œ ํŒŒ์ผ์„ ์™ธ์›Œ์•ผ ํ•ฉ๋‹ˆ๊นŒ? (๋˜๋Š”, _๋งค๋ฒˆ_ ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ๋ณ€์ˆ˜/ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•ด๋‹น ํŒŒ์ผ์„ ์—ด์–ด ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?)
  4. ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ด…์‹œ๋‹ค. ๊ฒŒ์‹œ๋ฌผ ๋์— ์žˆ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
  5. ์–ด๋””์—์„œ ๋ฉˆ์ถ”๋‚˜์š”? ์–ด๋””๊ฐ€ ๋‚˜์˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ? ํŒŒ์ผ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด ๋˜๋Š” ํ‚ค์›Œ๋“œ๋Š” ํŒŒ์ผ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. "use strict"๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    1. ์›ํ•˜๋Š” ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Javascript(์˜ˆ: Typescript)์˜ ๋Œ€๊ทœ๋ชจ ์ˆ˜ํผ ์„ธํŠธ๊ฐ€ ๋‹น์‹œ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

    2. ๊ทธ๊ฒƒ์€ JavaScript ์˜ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋†’์ด ๋ ค๋Š” ์‹œ๋„์˜€์Šต๋‹ˆ๋‹ค(๋‚ด ๋ˆˆ์—๋Š” ์ด๊ฒƒ์ด ๋ณ€๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค).

      "์—„๊ฒฉํ•œ ์‚ฌ์šฉ"์ด ์ฑ„ํƒ๋œ ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐœ๋ฐœ์ž์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š”

  6. Javascript๋Š” "nullable์ด ์•„๋‹Œ ์œ ํ˜• ์‹œ์Šคํ…œ"์ด ์•„๋‹ˆ๋ฉฐ Typescript๋Š” "nullable์ด ์•„๋‹Œ ์œ ํ˜• ์‹œ์Šคํ…œ"์ด ์•„๋‹™๋‹ˆ๋‹ค. nullable์ด ์•„๋‹Œ ํ˜•์‹์„ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ „์ฒด ์‹œ์Šคํ…œ์ด "non-nullable"์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Typescript์˜ ์š”์ ์ด ์•„๋‹™๋‹ˆ๋‹ค.
File 1:
"use notnull"
export string foo() {
    return "mygeneratedstring";
}
File 2:
export string foo() {
    return file1.foo()
}
File 3:
"use notnull"
file2.foo(); //???

์‹ค์ œ๋กœ ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฌธ๋งฅ ์ •๋ณด ๋ฅผ


์šฐ๋ฆฌ๋Š” ์„œํด์—์„œ ๋…ผ์Ÿํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ ๋ง์ด ์ดํ•ด๊ฐ€ ์•ˆ ๋œ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค๋งŒ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ œ๊ธฐํ•˜์‹œ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๊ณ„์†ํ•ด์„œ ๋‹ต๋ณ€์„ ๋“œ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@spion
ํ•ด๋‹น ์˜ˆ์ œ์—์„œ ๋ฌธ์ž์—ด์€ ์•”์‹œ์  null์ด ์•„๋‹™๋‹ˆ๋‹ค(--noImplicitNull ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ผœ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค).

string|null|undefined๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ์ œ์•ˆ์— ๋ช…์‹œ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ง์€ ์‹ค์ œ ์‹œ์Šคํ…œ์—์„œ var myString: string ๋Š” ์•”์‹œ์ ์œผ๋กœ var myString: (string | null | undefined); ์ด๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ณต์šฉ์ฒด ์œ ํ˜•์ด ์•„๋‹Œ ํ•œ typeguard๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ํŒŒ์ผ ๋‹น ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ ์ œ์•ˆ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ์ €์™€ ๋‹ค๋ฅธ ๋งŽ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ค‘์š”ํ•œ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ ์ „์ฒด์— ๊ฐ•์ œ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง€์‹œ๋ฌธ์€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์•„๋ฌด๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฝค ์ด์ƒํ•œ ์ด์œ ๋กœ ์ง€์‹œ๋ฌธ ์œ„์น˜์— ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด 'null์ด ์•„๋‹Œ ์‚ฌ์šฉ'์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ), ๋˜ํ•œ ์–ด๋Š ์‹œ์ ์—์„œ TypeScript๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด semver๊ฐ€ ๋ฉ”์ด์ € ๋ฒ„์ „์„ ์ •์˜ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งŒ๋“ค์ง€ ์•Š์€ ํŒŒ์ผ์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํŒŒ์ผ์— "null์ด ์•„๋‹Œ ์‚ฌ์šฉ"์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งŒ๋“  100๊ฐœ์˜ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ 100๊ฐœ์˜ ํŒŒ์ผ ์ค‘ null์ด ์•„๋‹Œ ํŒŒ์ผ์„ ์™ธ์›Œ์•ผ ํ•ฉ๋‹ˆ๊นŒ? (๋˜๋Š” ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ๋ณ€์ˆ˜/ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํŒŒ์ผ์„ ์—ด์–ด ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?)

๋ชจ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ€์ด๋“œ๋ผ์ธ ๋“ฑ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์— ์žˆ๋‹ค๋ฉด ... ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” ์•ฝ๊ฐ„๋งŒ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๋Š” ... ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...

์–ด๋””์—์„œ ๋ฉˆ์ถ”๋‚˜์š”? ์–ด๋””๊ฐ€ ๋‚˜์˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ? ํŒŒ์ผ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด ๋˜๋Š” ํ‚ค์›Œ๋“œ๋Š” ํŒŒ์ผ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. "use strict"๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์›ํ•˜๋Š” ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Javascript(์˜ˆ: Typescript)์˜ ๋Œ€๊ทœ๋ชจ ์ˆ˜ํผ ์„ธํŠธ๊ฐ€ ๋‹น์‹œ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ JavaScript์˜ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋†’์ด๋ ค๋Š” ์‹œ๋„์˜€์Šต๋‹ˆ๋‹ค(๋‚ด ๋ˆˆ์—๋Š” ์ด๊ฒƒ์ด ๋ณ€๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค). "use strict"๊ฐ€ ์ฑ„ํƒ๋œ โ€‹โ€‹์ด์œ ๋Š” ๊ทธ๊ฒƒ์ด ์˜ณ์€ ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐœ๋ฐœ์ž์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” typescript๊ฐ€ ์–ธ์–ด๊ฐ€ ์ž„์˜์˜ ๋ฒ”์œ„์—์„œ ์„ ์–ธ๋œ ๋ฌธ์ž์—ด๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‹ค๋ฅธ ์ž„์˜์˜ ๋ฒ”์œ„์— ์˜ํ–ฅ์„ ์ฃผ๋Š” 1(๊ทธ๋Ÿฐ ๋‹ค์Œ 2, 3, 4)์˜ ๋‹ค๋ฅธ ์ง€์‹œ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •๋ง ๋‚˜์œ ์–ธ์–ด ๋””์ž์ธ์ž…๋‹ˆ๋‹ค. Typescript์— "์—„๊ฒฉํ•œ ์‚ฌ์šฉ"์ด ์—†๊ณ  ๋Œ€์‹  ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

'use strict'๋Š” ์–ธ์–ด ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ ˆํŠธ๋กœ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ์ง๋ฉดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ์ด๋ฉฐ es6 ๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ ๋‹ค์†Œ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ use not null์€ ๋‹ค์Œ ์ฃผ์š” ๋ฒ„์ „์˜ typescript์—์„œ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ) .

Javascript๋Š” "nullable์ด ์•„๋‹Œ ์œ ํ˜• ์‹œ์Šคํ…œ"์ด ์•„๋‹ˆ๋ฉฐ Typescript๋Š” "nullable์ด ์•„๋‹Œ ์œ ํ˜• ์‹œ์Šคํ…œ"์ด ์•„๋‹™๋‹ˆ๋‹ค. nullable์ด ์•„๋‹Œ ํ˜•์‹์„ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ „์ฒด ์‹œ์Šคํ…œ์ด "non-nullable"์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Typescript์˜ ์š”์ ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ ๋ฌธ์žฅ์€ ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€์—†๊ณ  JavaScript์—๋Š” ์ •์  ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์—†์œผ๋ฏ€๋กœ string ์ด์ „์˜ ๋ณ€์ˆ˜์— null ๋ฅผ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์‰ฝ๊ฒŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๋ฌธ์ž์—ด์ด์—ˆ๋˜ ๋ณ€์ˆ˜์— 5 ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์—.
ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ, ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“  ํƒ€์ž… ๊ฒ€์‚ฌ๊ธฐ, opinionatedly ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด์ด ์œ ์ผํ•œ ์ฐจ์ด์  null ๋ชจ๋‘์— ํ• ๋‹น ํ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ 5 .

์˜ˆ๋ฅผ ๋“ค์–ด ํŒŒ์ผ ๊ฐ„์— ์ผ๋ถ€ ์ •๋ณด๊ฐ€ ์†์‹ค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์ ˆ์ถฉ์•ˆ์ด์ง€๋งŒ ๊ท€ํ•˜์˜ ์šฐ๋ ค๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์„œํด์—์„œ ๋…ผ์Ÿํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ ๋ง์ด ์ดํ•ด๊ฐ€ ์•ˆ ๋œ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค๋งŒ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ œ๊ธฐํ•˜์‹œ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๊ณ„์†ํ•ด์„œ ๋‹ต๋ณ€์„ ๋“œ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค, ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€ ์žˆ์„์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ ์ €๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํฌํฌํ•˜๊ณ  ์–ธ์  ๊ฐ€ ๋ฉ”์ธ ์ปดํŒŒ์ผ๋Ÿฌ ๋˜๋Š” ๊ทธ ํ๋ฆ„์—์„œ ๋๋‚˜๊ธฐ๋ฅผ ํฌ๋งํ•˜๋ฉด์„œ ์ž์‹ ์„ ์œ„ํ•ด null์ด ์•„๋‹Œ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์†”์งํžˆ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์„ฑ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

@griffork @spion ์•„์ด๋””์–ด๊ฐ€ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹์€ string ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์œผ๋ฉด ์•”์‹œ์  nullable number | null ์ด ํ•ญ์ƒ ์ฒซ ๋ฒˆ์งธ ์˜ค๋ฒ„๋กœ๋“œ์—์„œ ์œ ํ–‰ํ•˜๋ฏ€๋กœ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘์—์„œ foo(null) ๊ฒฝ์šฐ string ๋ฉ๋‹ˆ๋‹ค.

@RyanCavanaugh ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

@fdecampredon

  1. javascript๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด "use strict"๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์—์„œ
    nullable์ด ์•„๋‹Œ ์œ ํ˜•์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ฝ”๋“œ ๋‚ด ์ง€์‹œ๋ฌธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด ๋ฒ„๋ฆฐ ๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

Facebook ์— ๋”ฐ๋ฅด๋ฉด: "JavaScript์—์„œ null์€ ์•”์‹œ์ ์œผ๋กœ ๋ชจ๋“  ๊ธฐ๋ณธ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๊ฐœ์ฒด ์œ ํ˜•์˜ ์œ ํšจํ•œ ๊ฑฐ์ฃผ์ž์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค."
๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์—์„œ nullable์ด ์•„๋‹Œ ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋ ค๋Š” ์ด์œ ๋Š” nullable์ด ์•„๋‹Œ ๊ฒƒ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๋ฉฐ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์ด๋ผ๋Š” ๊ฒƒ์„ ์ธ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (์ด๊ฒƒ์ด ์ž˜๋ชป๋  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—) ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
nullable์ด ์•„๋‹Œ ์†์„ฑ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ๊ฝค ์˜ค๋žซ๋™์•ˆ Typescript๋ฅผ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ƒ์‚ฌ์—๊ฒŒ Javascript์—์„œ Typescript๋กœ ๋ณ€๊ฒฝํ•˜๋„๋ก ์„ค๋“ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ๊ณ  ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค(์—†๋”๋ผ๋„ ์‰ฝ์ง€ ์•Š์Œ) ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ์ƒ์‚ฌ๋ฅผ ์„ค๋“ํ•˜๋Š” ๊ฒƒ๋„ ๊ฝค ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ES:Harmony๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›๋˜๋ฉด ์šฐ๋ฆฌ๋Š” ์•„๋งˆ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ๊ณผ Typescript๊ฐ€ ES:Harmony๋ฅผ ์ง€์›ํ•˜๋Š” ์‹œ์  ์‚ฌ์ด์— Typescript์—์„œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋ฉด(ํŠนํžˆ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋„๋ฆฌ ํผ์ง„ ๊ฒฝ์šฐ) ๋‚˜๋Š” ๊ทธ ์ฃผ์žฅ์—์„œ ์Šน๋ฆฌํ•  ์ˆ˜ ์žˆ์„์ง€ ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋ฅผ ์žฌ๊ต์œกํ•˜๋Š” ๋ฐ ๋“œ๋Š” ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์€ ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ ์š”(์ €๋Š” "Typescript ๋‹ด๋‹น์ž"์ด๋ฉฐ Typescript ๊ฐœ๋ฐœ์ž๋ฅผ ๊ต์œกํ•˜๋Š” ๊ฒƒ์ด ์ œ ์ผ์ž…๋‹ˆ๋‹ค).
๋”ฐ๋ผ์„œ ์ €๋Š” ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์„ ์ •๋ง ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
์ด์ „ ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋ฏธ๋ž˜ ์ฝ”๋“œ์— ์ด๋ฅผ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด(์ด๊ฒƒ์ด ๋‚ด ์ œ์•ˆ์˜ ์ด์œ ์ž…๋‹ˆ๋‹ค) nullable์ด ์•„๋‹Œ ๊ฐ’์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด๋„ ๊ฐœ์˜์น˜ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ๊ฒฐ๊ตญ ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋ณ€ํ™˜๋˜์ง€๋งŒ ์‚ฌ๋žŒ์„ ๊ต์œกํ•˜๊ณ  ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋“œ๋Š” ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์€ ํ›จ์”ฌ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

ํŒŒ์ผ๋ณ„ ์ง€์‹œ๋ฌธ ๋Œ€์‹  ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

@Griffork ์ข‹์•„, ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋‚˜๋Š” ๋‹น์‹ ์˜ ๊ฑฑ์ •์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ ๋‚˜๋Š” ๊ฐ™์€ ์˜๊ฒฌ์ด ์•„๋‹ˆ๋ฉฐ ๊ธฐ์ˆ ์ด ๋ณ€ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค(Angular 2์— ๋Œ€ํ•œ ์ „์ฒด ๋“œ๋ผ๋งˆ๊ฐ€ ๊ทธ๊ฒƒ์„ ์ฆ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ œ๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ์„ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฌผ๊ฑด์„ ๋ถ€์ˆ˜๊ณ  ๋” ๋‚˜์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์žฅ๊ธฐ์ ์œผ๋กœ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์‹œ๊ฐ„๊ณผ ๋ˆ์„ ๋ฒŒ๊ฒŒ ํ•œ๋‹ค.
์ด์ œ ์šฐ๋ฆฌ ๋‘˜ ๋‹ค ์•ž์„œ ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ๋“ฏ์ด ์—ฌ๊ธฐ์—์„œ ํ•ฉ์˜๋ฅผ ์ด๋ฃฐ ์ˆ˜ ์žˆ์„์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ง€์‹œ๋ฅผ ์„ ํ˜ธํ•˜๊ณ , ๋‹น์‹ ์€ ์ œ์•ˆ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
์–ด์จŒ๋“  ๋‚ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๋งํ–ˆ๋“ฏ์ด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  null์ด ์•„๋‹Œ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
ํ† ๋ก  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์žฌ๋ฏธ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค

@fdecampredon

ํ† ๋ก ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ณ„๋ชฝ ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ (์žฌ๋ฏธ์žˆ๋Š” ์ž‘ํ’ˆ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค :D), ํ† ๋ก ๋„ ์ฆ๊ฑฐ์› ์Šต๋‹ˆ๋‹ค :).
ํฌํฌ์— ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ TS ๋‹ด๋‹น์ž๊ฐ€ ์šฐ๋ฆฌ์˜ ์ œ์•ˆ ์ค‘ ์ผ๋ถ€๋ฅผ ์ตœ์†Œํ•œ ๊ธฐ๊ฐํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ @RyanCavanaugh๊ฐ€ ์„ค๋ช…ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์„ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด null ์œ ํ˜•๊ณผ --noImplicitNull ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ํ”Œ๋ž˜๊ทธ ์—†์ด ์‹คํ–‰ํ•  ๋•Œ ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ ๋Š” ์ˆ˜์ •๋œ ๋™์ž‘์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

ํ˜•์‹ ์˜ค๋ฒ„๋กœ๋“œ์— |null ๊ฐ€ ํฌํ•จ๋  ๋•Œ๋งˆ๋‹ค(์ฃผ์–ด์ง„ ์˜ˆ์ œ์™€ ๊ฐ™์ด):

function fn(x: string): number;
function fn(x: number|null): string;

typechecker๋Š” ๋ชจ๋“  ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ทจํ•˜๊ณ  ๋ชฉ๋ก ๋์— ์ถ”๊ฐ€๋œ ํ•ด๋‹น ์ธ์ˆ˜ ์œ„์น˜์— (์•”์‹œ์ ) null์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๋ณ€ํ˜•์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

function fn(x: string): number;
function fn(x: number|null): string;
// implicit signature added at the end, caused by the first overload
function fn(x: null): number;

๊ฒฐ๊ณผ๋Š” ์—„๊ฒฉํ•œ --noImplicitNull ๋ฒ„์ „๊ณผ ๋™์ผํ•œ ํ•ด์„์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. null์ด ์ „๋‹ฌ๋˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ ์˜ค๋ฒ„๋กœ๋“œ๋Š” ๋ช…์‹œ์  number|null ์ž…๋‹ˆ๋‹ค. ํšจ๊ณผ์ ์œผ๋กœ ๋ช…์‹œ์  null์„ ์•”์‹œ์  null๋ณด๋‹ค ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

(์˜ˆ, ์•”์‹œ์  ์ •์˜์˜ ์ˆ˜๊ฐ€ |null ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์žˆ๋Š” ์ธ์ˆ˜์˜ ์ˆ˜์— ๋”ฐ๋ผ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ ํ˜•์ด ์—†๋Š” ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ ํŒจ์Šค์—์„œ null์„ "ํ—ˆ์šฉ"ํ•˜๋Š” ๋” ๋น ๋ฅธ ๊ตฌํ˜„์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€๋งŒ์ด ์ƒํ™ฉ์€ ๋“œ๋ฌผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋ฏ€๋กœ ์–ด๋Š ์ชฝ์ด๋“  ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค)

์ด์™€ ๊ฐ™์ด ๊ณต์‹ํ™”๋˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์™„์ „ํžˆ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๊ณ  ์˜ตํŠธ์ธ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‚˜๋จธ์ง€ ๋™์ž‘์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ชจ๋“  ์œ ํ˜•์˜ ๊ฐ’์— ๋Œ€ํ•ด null์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘๋Š” ๊ฒƒ๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ผœ์ ธ ์žˆ์œผ๋ฉด ๊ฐ’์ด null์ด ์•„๋‹ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ์—ฐ์‚ฐ์ž์— ์ „๋‹ฌ๋  ๋•Œ๊นŒ์ง€ ๊ฐ’์„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€(ํ• ๋‹น๋˜์ง€ ์•Š์Œ) ๋˜๋Š” null๋กœ ๋‚จ๊ฒจ๋‘๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๊ตฌ์„ฑ์›์— ๋Œ€ํ•ด ํ™•์‹คํ•˜์ง€ ์•Š์Œ:

  • ์ƒ์„ฑ์ž์˜ ๋์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜
  • ์ดˆ๊ธฐํ™”๋Š” ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฉค๋ฒ„ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…์‹œ์  null ๊ณต์šฉ์ฒด๋Š” ๋‘ ๋ชจ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ณต์šฉ์ฒด์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋…ธ๋™ ์กฐํ•ฉ ์œ ํ˜•์„ ์ขํžˆ๊ธฐ ์œ„ํ•ด ๊ฒฝ๋น„์›์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์œ„์˜ _all_ ๋Œ“๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ ์ •๋ง ๋งŽ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ๋Œ“๊ธ€๊ณผ 5๊ฐœ์›”์ด ์ง€๋‚œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ๊ฐ™์€ ์š”์ ์ธ ๊ตฌ๋ฌธ๊ณผ ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•ด ํ† ๋ก ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์€ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•œ ์ •์  null ๊ฒ€์‚ฌ์˜ ๊ฐ€์น˜์— ๋Œ€ํ•ด ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๋งํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค(+1).

์ง€๊ธˆ๊นŒ์ง€ ์ฃผ์š” ๋…ผ์Ÿ์€ ๊ตฌ๋ฌธ ๋ฐ ์ˆ˜๋งŽ์€ ๊ธฐ์กด TS ์ฝ”๋“œ ๋ฐ TS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. null ์œ ํ˜•์„ ๋„์ž…ํ•˜๊ณ  ?string Flow ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊น”๋”ํ•˜๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ด๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ string ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ _๋ชจ๋“ _ ๊ธฐ์กด ์ฝ”๋“œ์— ๋Œ€ํ•œ _๊ฑฐ๋Œ€ํ•œ_ ์ฃผ์š” ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์œ„์—์„œ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์€ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ( @RyanCavanaugh ๊ฐ€ ์ด๊ฒƒ์ด ๋”์ฐํ•œ ์ƒ๊ฐ์ธ ์ด์œ ๋ฅผ ์•„์ฃผ ์ž˜ ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค) ๋˜๋Š” ํŒŒ์ผ๋ณ„ ์ง€์‹œ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ํ•ดํ•™์ ์ธ ์ž„์‹œ๋ฐฉํŽธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋‚˜๋Š” diff ๋ฆฌ๋ทฐ๋‚˜ ๊ฑฐ๋Œ€ํ•œ ํŒŒ์ผ ์ค‘๊ฐ„์— ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•˜๊ณ  ๋‚ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ _ํ™•์‹คํžˆ_ ์ฆ‰์‹œ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 'use strict'; ๋Š” ์„ ๋ก€๋กœ ์ธ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ TS๊ฐ€ JS์˜ ๊ณผ๊ฑฐ ์‹ค์ˆ˜๋ฅผ ๋ฌผ๋ ค๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— "not null" ์ฃผ์„( string! , !string , ...)์ด ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํ† ๋ก ์—์„œ ์ƒˆ๋กœ์šด ์ฃผ์žฅ์„ ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š๋‹ค.

์•„๋ฌด๋„ ์ฝ”๋“œ ์ „์ฒด์— ์•ž๋จธ๋ฆฌ( ! )๋ฅผ ๊ฐ–๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. TS๋Š” ํƒ€์ดํ•‘์— ๋Œ€ํ•ด ๋งŽ์€ ๊ฒƒ์„ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค.

1. ์ง€์—ญ ๋ณ€์ˆ˜
๋‚ด ์ง€์—ญ ๋ณ€์ˆ˜์— ์•ž๋จธ๋ฆฌ๋กœ ์ฃผ์„์„ ๋‹ฌ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TS๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ•œ null ๋ฅผ ๋กœ์ปฌ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด๋„ ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค.

var x: string;  // Nullable
x.toString();  // Error: x can be undefined or null
x = "jods";
x.toUpperCase();  // Fine.
notNull(x);  // Fine

๊ฝค ์ž์ฃผ ์œ ํ˜• ๋Œ€์‹  ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

var x = "jods";  // x: string (nullable)
notNull(x);  // Fine
x = null;  // Fine
notNull(x);  // Error

2. ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’
๋งค์šฐ ์ž์ฃผ ๋‚˜๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TS๊ฐ€ ์œ ํ˜•์„ ์œ ์ถ”ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋„ ์ž…๋ ฅ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function() /* : string! */ {
  return "jods";
}

ํŽธ์ง‘: ์ƒ์† ๋ฐ ํ•จ์ˆ˜ ๋ณ€์ˆ˜๋กœ ์ธํ•œ ๋‚˜์œ ์ƒ๊ฐ, ์•„๋ž˜ @Griffork์˜ ์ฃผ์„ ์ฐธ์กฐ
๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์ œ๊ณตํ•˜๋ฉด TS๊ฐ€ "not null" ์ฃผ์„์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๋ก ๋œ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ํŒŒ์ƒ ํด๋ž˜์Šค๊ฐ€ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—) ์œ ํ˜•์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

function f() : string {  // f is nullable although this implementation never returns null.
  return "abc";
}

3. ๊ธฐ๋Šฅ ๋งค๊ฐœ๋ณ€์ˆ˜
์œ ํ˜•์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ null ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํ‘œ์‹œํ•ด์•ผ _ํ•ด์•ผ _ ํ•ฉ๋‹ˆ๋‹ค.

function (x: string!) { return x.toUpperCase(); } // OK
function (x: string) { return x.toUpperCase(); } // Error

์ด์ „ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด "No implicit any"๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ "Null dereference is error"๋ผ๋Š” ์ƒˆ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. _์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ถ„์„์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜๋กœ ๋ณด๊ณ ๋œ ๋‚ด์šฉ๋งŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค!_
์ถ”๊ฐ€ํ•  ์•ž๋จธ๋ฆฌ๊ฐ€ ๋งŽ์ฃ ? ์‹ค์ œ์˜ ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ํ†ต๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ ๋Š” ๋งํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” JS์—์„œ ์ผ๋ฐ˜์ ์ด๊ณ  ๋ชจ๋‘ nullable์ด๋ฏ€๋กœ 'not null'์ด ๊ธฐ๋ณธ๊ฐ’์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ์ฃผ์„์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
์ด๋Ÿฌํ•œ ์•ž๋จธ๋ฆฌ๋Š” ๋˜ํ•œ ํ˜„์žฌ string ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•˜์—ฌ ๋ฐœ์‹ ์ž์—๊ฒŒ null์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ข‹์€ ์•Œ๋ฆผ์ž…๋‹ˆ๋‹ค.

4. ํด๋ž˜์Šค ํ•„๋“œ
์ด๋Š” 3๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์šฉ์„ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์—์„œ ํ•„๋“œ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์„ ์–ธ ์‹œ ํ•ด๋‹น ํ•„๋“œ๋ฅผ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

class C {  x: string!; }

function(c: C!) // : string! is inferred
{ return c.x; } // OK, but annotations are required

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋‹ˆ์…œ๋ผ์ด์ €์˜ ์•ฝ์นญ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class C {
  x! = "jods"; // Note the bang: x is inferred as !string rather than just string.
}

์ด๋‹ˆ์…œ๋ผ์ด์ €์˜ ๊ธฐ๋ณธ๊ฐ’์ด not-null์ด๋ผ๊ณ  ํ•˜๋ฉด nullable ์†์„ฑ์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ์•ฝ์นญ์ด ๋ฐ”๋žŒ์งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋Œ€๋ถ€๋ถ„์˜ ํ•„๋“œ๊ฐ€ nullable์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ ์ด ์ฃผ์„์€ ์˜ค๋Š˜๋‚  ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

5. ์„ ์–ธ, .d.ts
ํฐ ์ด์ ์€ ๋ชจ๋“  ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. null ๋ฐ null์ด ์•„๋‹Œ ๊ฐ’์„ ์ž…๋ ฅ์œผ๋กœ ํ—ˆ์šฉํ•˜๋ฉฐ null ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
์ฒ˜์Œ์—๋Š” ์ผ๋ถ€ ๋ฐ˜ํ™˜ ๊ฐ’์„ "not null"๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์บ์ŠคํŒ…ํ•ด์•ผ ํ•˜์ง€๋งŒ, null์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์ •์˜๊ฐ€ ์ฒœ์ฒœํžˆ ์—…๋ฐ์ดํŠธ๋จ์— ๋”ฐ๋ผ ์ƒํ™ฉ์ด ๊ฐœ์„ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•˜์ง€๋งŒ ์„ฑ๊ณต์ ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ํ•„์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์˜ "not-null" ์ƒํƒœ๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ํ˜•์‹ํ™”๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ ๋˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ „์—ญ ์ƒํƒœ์— ๊ด€ํ•ด ์ผ๋ถ€ ์ฃผ์žฅ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ) ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

var a: { s: string } = something(); // Notice s is nullable.
notNull(a.s); // Error
notNull(<!>a.s);  // OK, this is a shorthand "not-null" cast, because the dev knows about something().

์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ - ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ - ๋ฌด์–ธ๊ฐ€๊ฐ€ null์ด ์•„๋‹˜์„ ์•”์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•˜๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ต์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ null์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ์ด๊ฒƒ์€ ๋งค์šฐ ๊ธด ๊ฒŒ์‹œ๋ฌผ์ด์—ˆ์Šต๋‹ˆ๋‹ค. "๊ธฐ๋ณธ์ ์œผ๋กœ null"์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋ชจ๋“  ์ฝ”๋“œ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ๋ณด์—ฌ์ฃผ๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. TS๋Š” ์šฐ๋ฆฌ์˜ ๋„์›€ ์—†์ด ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ์˜ ์ •ํ™•์„ฑ์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์˜ˆ์™ธ๋Š” ํ•„๋“œ์™€ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ง€๋‚˜์น˜๊ฒŒ ์‹œ๋„๋Ÿฝ์ง€ ์•Š๊ณ  ์ข‹์€ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์žฅ์ ์€ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jods4 ๋‹˜ ์ด ๋งํ•œ ๋Œ€๋ถ€๋ถ„์— ๋™์˜ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ๊ณผ ์šฐ๋ ค ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜ ์œ ํ˜•์—์„œ ์ž๋™์œผ๋กœ nullable์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์˜ˆ: ์ƒ์† ๋˜๋Š” ๋Œ€์ฒด๋˜๋Š” ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ)?

3 & 5) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ nullable์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ ํŒŒ์ผ์˜ ํ•จ์ˆ˜ ์„œ๋ช…์€ ์ด์ œ d.ts ํŒŒ์ผ์˜ ๋™์ผํ•œ ํ•จ์ˆ˜ ์„œ๋ช…๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6) ๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฑ…์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™/๋ณด์ž…๋‹ˆ๊นŒ?

2) ์ข‹์€ ์บ์น˜. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ƒ์†(๋˜๋Š” '๋Œ€๋ฆฌ์ธ')๊ณผ ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ TS์— ๋Œ€ํ•œ ๊ฒฝํ—˜์„ ํ•˜๋Š” ๊ณณ์€ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. TS๊ฐ€ ์•Œ์•„๋‚ด๊ณ  TS๊ฐ€ null/not null ๋ถ€๋ถ„์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ์œ ์ผํ•œ ๊ฒฝ์šฐ๋Š” ํ™•์žฅ์„ฑ(์ƒ์† ํฌํ•จ)์„ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. Null ํ—ˆ์šฉ ์—ฌ๋ถ€๋Š” ์ด ์„ค๋ช…์— ์•„์ฃผ ์ž˜ ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์ œ์•ˆ์„ ๋ณ€๊ฒฝํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ์ž…๋ ฅ๋œ ๋ฐ˜ํ™˜ ๊ฐ’์€ ๊ทธ๋ ‡๊ฒŒ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ nullable์ด ์•„๋‹Œ _not_ ์œ ์ถ”๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒฝ์šฐ์— ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ํด๋ž˜์Šค์—์„œ null์ผ ์ˆ˜ ์žˆ๋Š” ๊ณ„์•ฝ์—์„œ "not null"์„ ์œ ์ถ”ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

3 & 5) ์œ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ๋” ์ด์ƒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ? ์ฝ”๋“œ ๋ฐ ์ •์˜์˜ ํ•จ์ˆ˜ ์„œ๋ช…์€ ์ด์ œ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

6) ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ!
์ด๊ฒƒ์€ ํŠนํžˆ ๋ฏน์Šค์— ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๋ถ€๋ถ„์ด null์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ๋•Œ๋ฌธ์— null ์œ ํ˜• ๋ฆฌํ„ฐ๋Ÿด์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ๋งˆ์ง€๋ง‰ ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

var x: number | string!; // compiler error
var x: number | string; // x can be null
var x: number! | string!; // x cannot be null
function f<T>() : number | T; // f can be null
function f<T>() : number! | T; // f is nullable if T is nullable
function f<T, G>(): T | G; // f is nullable if T or G is nullable
function f<T>(): T | null; // f is nullable even if T is not nullable.
function f<T>(): T!; // Whatever T is, f never returns null.

// Generics constraint option 1
function f<T!>(x: T!, y: T): T!; // T: not nullable type, x: not-null, y: null, f: not-null
function f<T!>(x: T!, y: T): T;  // T: not nullable type, x: not-null, y: null, f: null

// Generics constraint option 2
function f<T!>(x: T, y: T | null): T; // same as option 1.1
function f<T!>(x: T, y: T | null): T | null;  // same as option 1.2

๋…ผ์˜๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ null์ด ์•„๋‹Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ƒˆ ๊ตฌ๋ฌธ๋„ ๋ฐœ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํ˜•์‹์ด null ํ—ˆ์šฉ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋Œ€๋กœ ์ œ๋„ค๋ฆญ ํ˜•์‹ T์— null์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด๋„ ํ•จ์ˆ˜๊ฐ€ T๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  null๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋„๋ก ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํƒ€์ž… ๋ฆฌํ„ฐ๋Ÿด์€ ๊ดœ์ฐฎ์ง€๋งŒ ๊ทธ๋‹ค์ง€ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค: var x: { name: string }! , ํŠนํžˆ ๋‘˜ ์ด์ƒ์˜ ๋ผ์ธ์— ๊ฑธ์ณ ์žˆ๋Š” ๊ฒฝ์šฐ :(

๋” ๋งŽ์€ ์˜ˆ:
null์ด ์•„๋‹Œ ์ˆซ์ž์˜ ๋ฐฐ์—ด number![]
null์ด ์•„๋‹Œ ์ˆซ์ž ๋ฐฐ์—ด: number[]!
์•„๋ฌด๊ฒƒ๋„ null์ผ ์ˆ˜ ์—†์Œ: number![]!
์ผ๋ฐ˜: Array<number!>[]

2, 3 & 5) ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์€ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
6)

function f<T>() : number | T; // f can be null
function f<T>() : number! | T; // f is nullable if T is nullable

์—ฌ๊ธฐ์„œ f๊ฐ€ null์„ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. f๊ฐ€ null์— ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๊ณต์šฉ์ฒด์˜ ๊ฒฝ์šฐ ๋‹ค์Œ ๊ตฌ๋ฌธ์ด ๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? (์กฐ๊ธˆ ์–ด๋ฆฌ์„์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฑฐ๋‚˜ ๋” ์‰ฝ๊ฒŒ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

var x = ! & number | string;

๋‘˜ ๋‹ค nullable์ด ์•„๋‹˜์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.


์œ ํ˜• ๋ฆฌํ„ฐ๋Ÿด์˜ ๊ฒฝ์šฐ var x: !{name: string} ๊ฐ€ ๋์— ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ฏ€๋กœ ๋ฆฌํ„ฐ๋Ÿด ํ‘œํ˜„์‹์˜ ์‹œ์ž‘ ๋ถ€๋ถ„๊ณผ ๋์— ์พ…์„ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jods4 ๋‚ด "๋ช…์‹œ์  null์ด ์•”์‹œ์  null๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค" ์ œ์•ˆ๋œ ์ˆ˜์ • ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ฝ์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋‹ค์–‘ํ•œ ์˜๋ฏธ๋ก ์  ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@๊ทธ๋ฆฌํฌํฌ
์˜ˆ, ๋ฌผ๋ก  "nullable์ž…๋‹ˆ๋‹ค"๋Š” "null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Œ"์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ํ‘œํ˜„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

function f() {} ๊ฐ€ ์‹ค์ œ๋กœ f ์˜ ์„ ์–ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Š” ๋‚˜์ค‘์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... f ๊ฐ€ null๋กœ ์„ค์ •๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ? function f!() {} ? ์ œ ์ƒ๊ฐ์—๋Š” ๋„ˆ๋ฌด ์ง€๋‚˜์น˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” typechecker๊ฐ€ ์ด๊ฒƒ์ด ํ•ญ์ƒ ์‚ฌ์‹ค์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๋‹ค๋ฅธ ๋“œ๋ฌธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์˜ต์…˜๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์กฐ๊ธˆ ์–ด๋ฆฌ์„์–ด ๋ณด์ด๊ณ  ์œ ํ˜• ์„ ์–ธ์— & ํ•˜๋‚˜์˜ ์ถ”๊ฐ€ ๊ธฐํ˜ธ๋ฅผ ๋„์ž…ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋ชฉ์ ์œผ๋กœ... ๊ทธ๊ฑด ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ์–ธ์–ด์—์„œ & AND ๋Š” ์—ฌ๊ธฐ์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” | OR ๋ณด๋‹ค ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋กœ ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ์•ž์— ๊ฐ•ํƒ€๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ๋ฌด์—‡์ด ๋” ์ข‹์•„ ๋ณด์ผ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ์ด ํ•„๋“œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

class C {
  name! = "jods";  // Field inferred string, but marked not nullable.
  // Maybe we could do that instead, which works with "!T" convention:
  name : ! = "jods";
  // That kind of make sense with the proposed <!> cast.
}

@spion
์˜ˆ, ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋‹น๋ฉดํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ fn(null) ์–ด๋–ค ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜๋Š” ์ƒˆ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? number ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” '์ƒ์„ฑ๋œ' ํ•˜๋‚˜? ๋‘ ๋ฒˆ์งธ ์˜ค๋ฒ„๋กœ๋“œ๋„ null ์ˆ˜๋ฝํ•˜์ง€๋งŒ string ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜์ž…๋‹ˆ๊นŒ?

๋‘ ๋ฒˆ์งธ๋กœ ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์Šค์œ„์น˜ ํ•œ ๋ฒˆ์œผ๋กœ ์†Œ์Šค ์ฝ”๋“œ์˜ ์ „์ฒด์ ์ธ ์˜๋ฏธ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. .d.ts ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ๋žŒ๋“ค์€ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์žฌ์‚ฌ์šฉ ๋˜๋Š” ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ)์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ œ์•ˆ์€ ๋‚ด ์†Œ์Šค ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ก ์  ์˜๋ฏธ๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ์— ๋‹ฌ๋ ค ์žˆ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋งค์šฐ ๊ฒฐํ•จ์ด ์žˆ๋Š” ์ œ์•ˆ์œผ๋กœ ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ปดํŒŒ์ผ๋˜๊ณ  ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ €๋Š” ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค!

@jods4

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋‘ ๋ฒˆ์งธ ๊ณผ๋ถ€ํ•˜๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

function fn(x: string): number;
function fn(x: number|null): string; 

์–ด๋–ค ํ”Œ๋ž˜๊ทธ๊ฐ€ ์‚ฌ์šฉ๋˜๋“  ๋‘ ๋ฒˆ์งธ ๋ช…์‹œ์  null์ด ์•”์‹œ์ (์ฒซ ๋ฒˆ์งธ null)๋ณด๋‹ค ์šฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

null ์œ ํ˜•์€ ํ˜„์žฌ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•จ๊ป˜ ๋„์ž…๋˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ด์ „ ๋ฒ„์ „๊ณผ ์™„์ „ํžˆ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ์œ ํ˜• ์ •์˜๋Š” ๊ณ„์†ํ•ด์„œ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@spion
์•”์‹œ์  function fn(x: null): number; ์˜ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‘ ๋ฒˆ์งธ ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ํ•ญ์ƒ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค๋ฉด ์–ด๋–ค ํ”Œ๋ž˜๊ทธ๊ฐ€ ์‚ฌ์šฉ๋˜๋”๋ผ๋„ ์ด ์ „์ฒด "์ˆ˜์ •"์€ ์ „ํ˜€ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ์งˆ๋ฌธ: ์˜ค๋Š˜๋‚  ๋ชจ๋“  lib ์ •์˜์—๋Š” "null ํ—ˆ์šฉ" ๋™์ž‘์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ _all_ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๊นŒ์ง€ "์•”์‹œ์ ์œผ๋กœ null" ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ผœ์ง„ ์ƒํƒœ์—์„œ ํ”„๋กœ์ ํŠธ์—์„œ null์ด ์•„๋‹Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

// null by default flag turned on because of 3rd party libs.
function (x: string)   // <- how do I declare this not null?
{ return x.toUpperCase(); }

์ˆ˜์ •์€ ํ™•์‹คํžˆ ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ๋™์ž‘์„ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค์–ด ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์˜๋ฏธ๋ก ์  ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‘˜์งธ, ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด "๊ธฐ๋ณธ์ ์œผ๋กœ null" ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ด์ ์„ ์–ป๊ธฐ ์œ„ํ•ด _์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์˜ ๋‹จ์–ด ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ์„ ์–ธ์€

declare function wordCount(s: string): number;

์ฝ”๋“œ์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function sumWordcounts(s1:string, s2:string) {
  return wordCount(s1) + wordCount(s2);
}

์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋‘ ์ปดํŒŒ์ผ๋Ÿฌ ๋ชจ๋‘์—์„œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์•”์‹œ์  null์ด ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์™„์ „ํžˆ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

์™œ์š”? ์˜ค๋Š˜๋‚ ๊ณผ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฏธ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ๊ฐ’์ด null์ด ์•„๋‹ˆ๋ผ๋Š” ๋ฏฟ์Œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์ด๋ก ์ ์œผ๋กœ๋Š” null์ผ ์ˆ˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ).

๋˜ํ•œ ์ƒˆ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ฐ’์ด null์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด null์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ง€์ •ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅด๊ฒŒ ๋ฏฟ์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์ž‘์˜ ์ผ๋ถ€๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋™์ž‘์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ null์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘๊ณ  ์œ„์™€ ๊ฐ™์€ ํ•จ์ˆ˜์— ํ•ด๋‹น ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด์ œ wordCount ์˜ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function wordCount(s) {
  if (s == '') return null;
  return s.split(' ').length
}

์•—, ์ด ์œ ํ˜•์ด ๋ชจ๋“  ๊ฒƒ์„ ๋งํ•ด์ฃผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ null ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋ฐ”๋กœ ๊ทธ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋”๋ผ๋„ ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ „์ฒด ์ด์•ผ๊ธฐ๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ฐ˜ํ™˜ ๊ฐ’์ด null์ผ ์ˆ˜ ์žˆ์Œ์„ ์•”์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž ์žฌ์  null ๊ฐ’์— ์ž˜๋ชป ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ•ญ์ƒ ํ–‰๋ณตํ•˜๊ฒŒ ์œ ํšจํ•œ ์ˆซ์ž๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

noImplicitNull ๋ณ€๊ฒฝ ํ›„ ๋™์ผํ•œ ์œ ํ˜• ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๊ธฐ์—์„œ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋ถˆ๋งŒ ์—†์ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ wordCount๊ฐ€ ํ•ญ์ƒ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ–‰๋ณตํ•˜๊ฒŒ ์ƒ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋นˆ ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์—ฌ์ „ํžˆ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด์ „ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฐ˜ํ™˜๋œ ์ˆซ์ž๊ฐ€ null์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฒฝ๊ณ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์œ ํ˜• ์ •์˜๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ์ƒˆ ์ˆซ์ž๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค). ๊ทธ๋ฆฌ๊ณ  ๋™์ผํ•œ ๋™์ž‘์„ ์›ํ•˜๋ฉด ์ฝ”๋“œ์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (1)

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋” ์ž˜ _ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค_: wordCount์— ๋Œ€ํ•œ ๊ฐœ์„ ๋œ ์œ ํ˜• ์ •์˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

declare function wordCount(s:string):string|null;

null ๋ฐ˜ํ™˜ ๊ฐ’์„ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  wordCount ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋งˆ๋‹ค ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ์ ์€ ์ด ๊ฐœ์„  ์‚ฌํ•ญ์ด ์™„์ „ํžˆ ์„ ํƒ ์‚ฌํ•ญ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์œ ํ˜• ์„ ์–ธ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ  ์ง€๊ธˆ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ๋™์ž‘์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์„ ์–ธ์€ ๋” ๋‚˜๋น ์ง€์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(2) - ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๋ผ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋” ์ •ํ™•ํ•˜๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


(1): ์œ ํ˜• ์ •์˜๋ฅผ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„ ์—ฌ๊ธฐ์— ์ด๋ฏธ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์œ ํ˜• ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ˆ˜๋กœ null์„ sumWordcounts ์ „๋‹ฌํ•  ์ˆ˜ ์—†์œผ๋ฉฐ wordCount ํ•จ์ˆ˜๊ฐ€ ํ•ด๋‹น null์„ .split() ํ•˜๋ ค๊ณ  ํ•  ๋•Œ null ํฌ์ธํ„ฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

sumWordcounts(null, 'a'); // error after the change

(2): ๊ทธ๋ž˜, ๊ฑฐ์ง“๋ง์ด์•ผ. ์œ ํ˜• ์„ ์–ธ์€ ์„ ํƒ์  ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ nullable ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์˜ ์ž‘์€ ํ•˜์œ„ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ๋” ๋‚˜๋น ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ ํƒ์  ์ธ์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

declare function f(a: string, b?:string); 

๊ทธ๋Ÿฌ๋‚˜ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ฉฐ null์ผ ์ˆ˜ ์žˆ๋Š” ์ธ์ˆ˜์—๋Š” ํ•ด๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

declare function f(a: string, b:string); // a can actually be null

๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ๋งค์šฐ ๋“œ๋ฌผ๊ณ  ํ•„์š”ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ตœ์†Œํ™”๋  ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

@spion

์ˆ˜์ •์€ ํ™•์‹คํžˆ ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ๋™์ž‘์„ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฉด์—์„œ ์™„์ „ํ•œ ์˜ˆ๋ฅผ ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹น์‹ ์€ ๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋‘ ๋ฒˆ์งธ ๊ณผ๋ถ€ํ•˜๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜์ • ์‚ฌํ•ญ์ด ํšจ๊ณผ๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋‘ ์ปดํŒŒ์ผ๋Ÿฌ ๋ชจ๋‘์—์„œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์•”์‹œ์  null์ด ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์™„์ „ํžˆ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์˜ค๋ฅ˜ ์—†์ด ์ปดํŒŒ์ผ๋˜์ง€๋งŒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. sumWordCounts() ๋กœ ์ž…๋ ฅํ•œ๋‹ค number! 1 ์ผ€์ด์Šค์™€ number? ์ œ์ด๋‹ค. ์Šค์œ„์น˜๋กœ ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ฐ”๋žŒ์งํ•˜์ง€ _์•Š์Šต๋‹ˆ๋‹ค_. ์•ž์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด ๋ณ€๊ฒฝ์€ ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ๊ณผ ๊ฐ™์€ ์ „์—ญ์  ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ƒˆ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ฐ’์ด null์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ฏฟ์„ ์ด์œ ๊ฐ€ ์—†๋‹ค.

์•„๋‹ˆ! ์ด๊ฒƒ์ด ์š”์ ์ž…๋‹ˆ๋‹ค. ์ž ์žฌ์ ์œผ๋กœ null ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚˜์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฝ”๋”ฉํ•  ๋•Œ์ฒ˜๋Ÿผ null์ด ์•„๋‹ˆ๋ผ๊ณ  "๊ฐ€์ •"ํ•œ๋‹ค๋ฉด ์ด ๊ธฐ๋Šฅ์€ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!

๋™์ž‘์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ null์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘๊ณ  ์œ„์™€ ๊ฐ™์€ ํ•จ์ˆ˜์— ํ•ด๋‹น ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

"์œ„์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ"์ด ์‹ค์ œ๋กœ null์„ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ์ดํ•ด๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์˜ ๋์„ ์ฝ์œผ๋ฉด์„œ ์Šค์œ„์น˜๋ฅผ ์ผค ๋•Œ๊นŒ์ง€ ์‹ค์ œ ์ •์  null ๋ถ„์„์„ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜๊ฐ€ _all__ ์ˆ˜์ •๋  ๋•Œ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. :(

์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•ด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์™€ ๋ชจ๋“  ๊ฒƒ์ด ๋‹จ์–ด๋งŒ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์‹ค์šฉ์ ์ธ ์˜ˆ๊ฐ€ ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์˜ˆ์ œ์™€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š”์ง€์ž…๋‹ˆ๋‹ค.

null์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” yes(): string! ํ•จ์ˆ˜์™€ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” no(): string? ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

.d.ts ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

declare function yes(): string;
declare function no(): string;

์ •์ ์œผ๋กœ ํ™•์ธ๋œ null์„ ํ™œ์šฉํ•˜๊ณ  ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ TS์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ nullness ์ •๋ณด๋กœ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ƒํ™ฉ์œผ๋กœ _์ ์ง„์ ์œผ๋กœ_ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์ œ์•ˆํ•œ not null ์ˆ˜์ •์ž ! ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function x(s: string!) {  // inferred : string, could be explicit if we want to
  return s.length === 0 ? null : s;  // no error here as s is declared not null
}

x(no());  // error: x called with a possibly null parameter
y(<!>yes());  // no error because of not null cast. When .d.ts is updated the cast can be dropped.

๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ์•„์ด๋””์–ด์™€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ์š”?

์ด ์Šค๋ ˆ๋“œ๋Š” ๋„ˆ๋ฌด ๊ธด ํ† ๋ก (๋Œ“๊ธ€ 130๊ฐœ!)์œผ๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์–ธ๊ธ‰ํ•œ ์•„์ด๋””์–ด, ์ œ์•ˆ ๋ฐ ๋ฌธ์ œ๋ฅผ ๋”ฐ๋ฅด๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ๊ตฌ๋ฌธ, TS์—์„œ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ, ์˜ค๋ฅ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ์ œ์•ˆ์œผ๋กœ ์™ธ๋ถ€ ์š”์ ์„ ๋งŒ๋“ค ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

@spion ์•„์ด๋””์–ด์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํฌํ•จ๋˜๋ฏ€๋กœ ๊ฐ ์ฝ”๋“œ ์กฐ๊ฐ์— ๋Œ€ํ•ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์„ค์ •ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ TS ๋™์ž‘์„ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

!T null์ด ์•„๋‹Œ ๋งˆ์ปค์˜ ์š”์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://gist.github.com/jods4/cb31547f972f8c6bbc8b

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด์ ์ด ์žˆ์ง€๋งŒ ์œ„์˜ ๋‚ด ์˜๊ฒฌ๊ณผ ๋Œ€๋ถ€๋ถ„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

  • ๋‚˜๋Š” ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ 'null์ด ์•„๋‹Œ' ์ธก๋ฉด์ด ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ์œ ์ถ”๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค(ํ•ด๋‹น ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•œ @spion ๋•๋ถ„์—).
  • ๋‚˜๋Š” ํŠนํžˆ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ถ”๋ก ์— ๋Œ€ํ•ด, @Griffork ์ฃผ์„์„ ํฌํ•จํ•˜๊ณ  ๋‚˜๋Š” ์‹œ๋„ !T ๋Œ€์‹  T! .
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์„ฑ์ž ๋™์ž‘์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์„น์…˜์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž์œ ๋กญ๊ฒŒ ์˜๊ฒฌ์„ ์ œ์‹œํ•˜๊ณ , ํฌํฌํ•˜๊ณ , ๋Œ€์•ˆ ์ œ์•ˆ์„ ๋งŒ๋“œ์‹ญ์‹œ์˜ค( ?T ).
์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋„๋ก ๋…ธ๋ ฅํ•ฉ์‹œ๋‹ค.

@jods4

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋‘ ๋ฒˆ์งธ ๊ณผ๋ถ€ํ•˜๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜์ • ์‚ฌํ•ญ์ด ํšจ๊ณผ๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  1. ์ด๋Š” ๋‘ ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•ด ์–ธ์–ด ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์˜ค๋ฅ˜ ์—†์ด ์ปดํŒŒ์ผ๋˜์ง€๋งŒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. sumWordCounts()๋Š” ์ˆซ์ž๋กœ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค! ํ•˜๋‚˜์˜ ๊ฒฝ์šฐ์™€ ์ˆซ์ž๋กœ? ๋‘ ๋ฒˆ์งธ์—์„œ. ์Šค์œ„์น˜๋กœ ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ž์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด ๋ณ€๊ฒฝ์€ ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ๊ณผ ๊ฐ™์€ ์ „์—ญ์  ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‚ด ์ œ์•ˆ์— number! ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์œ ํ˜•์€ ๋‹จ์ˆœํžˆ number ์ž…๋‹ˆ๋‹ค. ์ฆ‰, null ๊ฐ’์„ ์ œ์™ธํ•˜๊ณ  ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ์ด ๊ณ„์† ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ช…์‹œ์  null์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋™์ž‘์ด ์•”์‹œ์  null๋ณด๋‹ค ์šฐ์„ ํ•˜์—ฌ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ! ์ด๊ฒƒ์ด ์š”์ ์ž…๋‹ˆ๋‹ค. ์ž ์žฌ์ ์œผ๋กœ null ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚˜์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฝ”๋”ฉํ•  ๋•Œ์ฒ˜๋Ÿผ null์ด ์•„๋‹ˆ๋ผ๊ณ  "๊ฐ€์ •"ํ•œ๋‹ค๋ฉด ์ด ๊ธฐ๋Šฅ์€ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!

  1. ๋‚ด๊ฐ€ ํ‘œํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ์š”์ ์€ (์œ ํ˜• ์„ ์–ธ ์ธก๋ฉด์—์„œ) ๊ธฐ๋Šฅ์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์ด ๊ฑฐ์˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ด์ „๊ณผ ๋˜‘๊ฐ™์€ ๋™์ž‘์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. null ์œ ํ˜• ๊ฐ’์ด ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด์ „์— object ๋ฐ string ์œ ํ˜•์˜ ๊ฐ’์— ๋Œ€ํ•ด string ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฌธ์ž์—ด ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์ ˆ๋Œ€ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ œ Object ๋Œ€ํ•ด ๋ณ„๋„์˜ ์œ ํ˜•์„ ๊ฐ–๊ฒŒ ๋˜๋ฉฐ ๋Œ€์‹  ํ•ด๋‹น ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹˜์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"์œ„์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ"์ด ์‹ค์ œ๋กœ null์„ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ์ดํ•ด๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function sumWordcounts(s1:string, s2:string) {
  return wordCount(s1) + wordCount(s2);
}

์ƒˆ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ์—์„œ๋Š” sumWordCounts(null, null); ์™€ ๊ฐ™์€ null ๊ฐ’์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ด๊ฒƒ์ด ์œ ์ผํ•œ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค. wordCounts ์˜ ์ •์˜๋Š” ๋ฌธ์ž์—ด์„ ์ทจํ•˜๊ณ  ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๋งํ•˜๋ฏ€๋กœ ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์˜ ๋ ๋ถ€๋ถ„์„ ์ฝ์œผ๋ฉด์„œ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜๊ฐ€ ์ˆ˜์ •๋  ๋•Œ๊นŒ์ง€ ํ•  ์ˆ˜ ์—†๋Š” ์Šค์œ„์น˜๋ฅผ ์ผค ๋•Œ๊นŒ์ง€ ์‹ค์ œ ์ •์  null ๋ถ„์„์„ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. :(

๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” null/undefined์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์—์„œ ํ•ด๋‹น ๊ฐ’์ด ์™„์ „ํžˆ ๊ด€๋ จ ์—†๋Š” ์œ„์น˜๋กœ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ ์™ธ์—๋Š” null ๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์ €๊ธฐ์— ์„ ํƒ์  ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ณ  ์ƒˆ ์Šค์œ„์น˜๋กœ ์ ์ ˆํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๋‚ด ์˜ˆ์™€ ๊ฐ™์ด null ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋Œ€ํ‘œ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š”์ ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค).

๋‚ด๊ฐ€ ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ์œ ํ˜• ์ •์˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ƒํƒœ๋กœ ์œ ์ง€๋  ๊ฒƒ์ด๋ฉฐ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‚จ์•„ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด null ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์ˆ˜์ •ํ•˜์ง€ ์•Š๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๊ทธ์— ๋”ฐ๋ผ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋” ๊ฐ•๋ ฅํ•œ ๋ณด์ฆ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” typescript์˜ ๋ชฉํ‘œ์™€ ์™„์ „ํžˆ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.


์ข‹์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์œ ํ˜• ์ •์˜๋Š”

declare function yes(): string;
declare function no(): string;

๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๊ธฐ ์ „์— ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function x(s: string) {
  return s.length === 0 ? null : s;
}

์ƒˆ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋™์ž‘์€ ์ด์ „ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

x(no());  // no error
x(yes());  // no error

x()์˜ ๊ฒฐ๊ณผ์™€ ๊ฐ™์ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ null์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์‹œ๋„ํ•˜์ง€ ์•Š๋Š” ํ•œ

x(x(no())) // error, x(something) may be null

no() ๋ณด๊ณ  null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ชจ๋ธ๋งํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์œ ํ˜• ์ •์˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ œ์•ˆ์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋‹ฟ๋Š” ๋ชจ๋“  ๋‹จ์ผ ์ฝ”๋“œ ๋ผ์ธ์€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ ์œ ํ˜• ์ •์˜๋ฅผ ๊ฐ€์ง„ ํ•จ์ˆ˜๋„ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‹จ์ผ ์ธ์ˆ˜ ์ฃผ์„์„ ๋ชจ๋“  ๊ณณ์—์„œ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ! ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆํ‰ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๊ณณ์—์„œ null ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์€ TypeScript์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ํ˜„์žฌ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. null ๊ฐ’์— ๋Œ€ํ•œ ์ด์ค‘ ํ•ด์„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

T ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— null์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ T ์œ ํ˜•์ด ํ•„์š”ํ•œ ์ธ์ˆ˜๋กœ null์„ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์œ ํ˜•์ด T|null ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

T ์œ ํ˜•์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์œ ํ˜•์ด T ์ด๊ณ  null ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ๋ชจ๋“  ์ผ๋ฐ˜ ์œ ํ˜• T ์„ ํ•ญ์ƒ T|null ๋กœ ์ทจ๊ธ‰ํ•˜๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ด‘์‚ฐ์€ T ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "์˜ฌ๋ฐ”๋ฅด๊ฒŒ" ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ฃผ์žฅ์€ "๋‹จ์ง€ T " ๋ณ€ํ˜•์ด ๋ณด๊ธฐ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ๊ณ ํ†ต์Šค๋Ÿฝ๊ณ  ๋Œ€๋‹ค์ˆ˜์˜ ์ฝ”๋“œ์™€ ์กฐํ™”๋ฅผ ์ด๋ฃฌ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ œ์•ˆ์ด "!" ์—†์ด ์œ ํ˜•์„ ๊ณ„์† ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋˜๋Š” "?" ์ด์ „๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ. ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€๋งŒ ์ด์ ์„ ์–ป์œผ๋ ค๋ฉด ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํžˆ ๊ฒ€์‚ฌ/๋˜์ง€๊ธฐ ์ด์™ธ์˜ null ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@spion

1. ๋‘ ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•ด ์–ธ์–ด ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋‹จ์ง€ ๊ฐ™์€ ์‚ฌ์‹ค์„ ๋งํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์–ด๋–ค ๊ฒฝ์šฐ์— ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃจ์–ด์ง€๋Š”์ง€๋Š” ์—ฌ์ „ํžˆ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌผ์—ˆ๋‹ค.

1.์ œ ์ œ์•ˆ์„œ์— number! ์ด(๊ฐ€) ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์œ ํ˜•์€ ๋‹จ์ˆœํžˆ number ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์€ ๋‹ค๋ฅด์ง€๋งŒ ๊ธฐ๋ณธ ๊ฐœ๋…์€ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ number! ๋ผ๊ณ  ๋งํ•  ๋•Œ ๋‚˜๋Š” ๋„์ด ์•„๋‹Œ ์ˆซ์ž ์œ ํ˜•์„ ๊ฐ•์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ท€ํ•˜์˜ ์ œ์•ˆ์—์„œ ๋‹จ์ˆœํžˆ number ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ๋Š” ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ number ๊ฐ€ ์•„๋‹ˆ๋ผ number | null ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” null/undefined์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์—์„œ ํ•ด๋‹น ๊ฐ’์ด ์™„์ „ํžˆ ๊ด€๋ จ ์—†๋Š” ์œ„์น˜๋กœ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ ์™ธ์—๋Š” null ๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์ €๊ธฐ์— ์„ ํƒ์  ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ณ  ์ƒˆ ์Šค์œ„์น˜๋กœ ์ ์ ˆํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๋‚ด ์˜ˆ์™€ ๊ฐ™์ด null ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋Œ€ํ‘œ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š”์ ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค).

๋‚˜๋Š” ์ด์™€ ๊ฐ™์€ ์„ค๋ช…์ด ๋งŽ์€ ๊ฐ€์ •๊ณผ ์ง€๋ฆ„๊ธธ์„ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ง„ํ–‰์„ ์œ„ํ•ด์„œ๋Š” ์ฝ”๋“œ, ๊ตฌ๋ฌธ ๋ฐ ์‹œ์Šคํ…œ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์„ค๋ช…์ด ํฌํ•จ๋œ ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์˜ˆ์ œ๋กœ ๋„˜์–ด๊ฐˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋งํ•œ๋‹ค:

๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” null/undefined์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ ์™ธ์—๋Š” null ๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งค์šฐ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์„ ํƒ์  ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋”์šฑ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ทธ๋Ÿฌํ•œ ์˜ˆ์ œ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค.

, ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ณ  ์ƒˆ ์Šค์œ„์น˜๋กœ ๊ทธ์— ๋”ฐ๋ผ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํฐ ์ง€๋ฆ„๊ธธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์„ ํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์ด ์‹ค์ œ JS ์ฝ”๋“œ๋กœ ํ–ฅํ•˜๋Š” ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ declare function(x: {}); ๋‚ด๋ถ€ ๋˜๋Š” interface ๋‚ด๋ถ€์˜ ์„ ํƒ์  ์ธ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ "์ธ์‹"ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ•จ์ˆ˜๊ฐ€ ๋‚ด ์˜ˆ์™€ ๊ฐ™์ด null ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งค์šฐ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ํ•จ์ˆ˜๊ฐ€ null ๋˜๋Š” undefined ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. find (ํ•ญ๋ชฉ์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ), getError (์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ) ๋“ฑ ... ๋” ๋งŽ์€ ์˜ˆ๋ฅผ ๋ณด๋ ค๋ฉด ํ‘œ์ค€ ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. _plenty_๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ์œ ํ˜• ์ •์˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ƒํƒœ๋กœ ์œ ์ง€๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์ด์ „ ์˜๊ฒฌ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋‚˜๋จธ์ง€ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ null ์‚ฌ๋ก€๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ์— ๋”ฐ๋ผ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋” ๊ฐ•๋ ฅํ•œ ๋ณด์ฆ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” typescript์˜ ๋ชฉํ‘œ์™€ ์™„์ „ํžˆ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์ด ์ง„์ˆ ์€ ๋‚˜์—๊ฒŒ ์‚ฌ์†Œํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ๋“ค์–ด์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํŠนํžˆ _์ ์ง„์ ์œผ๋กœ_ ๋ถ€๋ถ„.

์ด์ œ ์ œ์•ˆ์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋‹ฟ๋Š” ๋ชจ๋“  ๋‹จ์ผ ์ฝ”๋“œ ๋ผ์ธ์€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ ์œ ํ˜• ์ •์˜๋ฅผ ๊ฐ€์ง„ ํ•จ์ˆ˜๋„ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‹จ์ผ ์ธ์ˆ˜ ์ฃผ์„์„ ๋ชจ๋“  ๊ณณ์—์„œ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ! ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆํ‰ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ๊ณณ์— null ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฑฐ์˜ ์™„์ „ํžˆ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์“ด ์š”์ง€๋ฅผ ์ž˜ ์ฝ์–ด์ฃผ์„ธ์š”. ์‹ค์ œ๋กœ๋Š” null์ด ์•„๋‹Œ ์ฃผ์„์ด ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ _ํ•˜๋‚˜์˜_ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ๊ฐ€์ ธ์™€์„œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋‚ด ์ œ์•ˆ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฃผ์„์ด ์—†์–ด๋„ null ๋ถ„์„ ์ด์ ์„ ๋งŽ์ด ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Flow ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์–ป๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฐฉ์‹).
  • ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด null์ด ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
declare function f(): string; // existing declaration, but f will never return null.
var x = f();
x.toUpperCase();  // error, possibly null reference.

์žฅ๊ธฐ์  ์ˆ˜์ •์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜๋ฅผ ๋” ์ •ํ™•ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. declare function f(): !string;
๋‹จ๊ธฐ ์ˆ˜์ •์€ null์ด ์•„๋‹Œ ์บ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: var x = <!>f(); .
๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ์ข…์†์„ฑ์ด ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก "no implicit any"์™€ ์œ ์‚ฌํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. "๊ฐ€๋Šฅํ•œ null ์ฐธ์กฐ๋ฅผ ๊ฒฝ๊ณ ๋กœ ์ฒ˜๋ฆฌ". ์ฆ‰, ์ƒˆ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ •์˜๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ : ๊ท€ํ•˜์˜ ์ œ์•ˆ๊ณผ ๋‹ฌ๋ฆฌ ์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋กœ ๋ณด๊ณ ๋œ ๋‚ด์šฉ๋งŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด ํ† ๋ก ์—์„œ ์ง„์ „์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ์š”์ง€๋ฅผ ๋ณด๊ณ  ํ”Œ๋ž˜๊ทธ์˜ ๋‘ ์ƒํƒœ ๋ชจ๋‘์—์„œ ์ž์‹ ์˜ ์•„์ด๋””์–ด, ์ฝ”๋“œ ์˜ˆ์ œ ๋ฐ ๋™์ž‘์œผ๋กœ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ์ฝ”๋”์ด๋ฏ€๋กœ ๋” ๋ช…ํ™•ํ•ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์—ฃ์ง€ ์ผ€์ด์Šค๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ๋‚˜๋ฉด ํŠน๋ณ„ํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์งˆ๋ฌธ์ด ๋งŽ์ด ์žˆ์ง€๋งŒ ์ •ํ™•ํ•œ ์ •์˜ ์—†์ด ๊ฐœ๋…๊ณผ ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ํ† ๋ก ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์•„๋ฌด ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด 130๊ฐœ ์ด์ƒ์˜ ๋Œ“๊ธ€ ๋ฌธ์ œ์—์„œ ์ง„ํ–‰ ์ค‘์ธ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ํ† ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ _์ผ๋ฐ˜์ ์ธ_ ํ† ๋ก ์„ ๊ณ„์†ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

TS์—์„œ null์ด ์•„๋‹Œ ์œ ํ˜•์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ์œ„ํ•ด ๊ฐ๊ฐ ๋‹จ์ผ ์„ค๊ณ„ ์ œ์•ˆ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. !T ๊ตฌ๋ฌธ์„ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด #1800์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

@spion ๋””์ž์ธ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด null์ด ์•„๋‹Œ ์œ ํ˜•์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์–ธ์–ด(์˜ˆ: Rust)์—์„œ๋Š” ์‰ฝ์ง€๋งŒ ๊ธฐ์กด ์–ธ์–ด์—์„œ๋Š” ๊ฐœ์กฐํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค(์‚ฌ๋žŒ๋“ค์€ ์˜ค๋žซ๋™์•ˆ .net์—์„œ null์ด ์•„๋‹Œ ์ฐธ์กฐ๋ฅผ ์š”์ฒญํ•ด ์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์„). ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋Œ“๊ธ€์„ ๋ณด๋ฉด ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹˜์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Flow๋Š” ์ด๊ฒƒ์ด TS๋ฅผ ์œ„ํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์‹คํ˜„ํ•˜๋„๋ก ๋…ธ๋ ฅํ•ฉ์‹œ๋‹ค!

@jods4 ์œ ๊ฐ์ด์ง€๋งŒ ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ null์ด ์•„๋‹Œ ์œ ํ˜•๊ณผ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ์ผ์ข…์˜ ์ œ์–ด ํ๋ฆ„ ๋ถ„์„๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ ๊ฑฐ์˜ โ€‹โ€‹์˜ˆ์ธกํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ ˆํŠธ๋กœ ํ˜ธํ™˜์„ฑ์„ ์™„์ „ํžˆ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค (์‚ฌ์‹ค ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ์œ ํšจํ•ฉ๋‹ˆ๋‹ค 1.4 ts๋Š” ์š”์ ์— ์„ค๋ช…๋œ ๊ทœ์น™์— ๋”ฐ๋ผ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค).
๋‚˜๋Š” ํ† ๋ก ์ด ์•„๋ฌด๋ฐ๋„ ๊ฐ€์ง€ ์•Š๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ 130๊ฐœ ์ด์ƒ์˜ ๋Œ“๊ธ€์ด ์•„๋งˆ๋„ ๋„ˆ๋ฌด ๋งŽ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋งˆ๋„ ์—ฌ๊ธฐ์— ํ† ๋ก ํ•˜๋Š” ๋‘ ๊ทธ๋ฃน์˜ ์‚ฌ๋žŒ๋“ค์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • null์ด ์•„๋‹Œ ์œ ํ˜•์ด ๊ธฐ๋ณธ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ ์ž ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค(ํ”Œ๋ž˜๊ทธ ๋˜๋Š” ๊ธฐํƒ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด)
  • null์ด ์•„๋‹Œ ์œ ํ˜•์„ ์›ํ•˜์ง€ ์•Š๊ณ  ๋„์ž…์„ ํ”ผํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์œผ๋กœ ํ‘ธ์‹œํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค.

๊ทธ ๋‘ ๊ทธ๋ฃน์˜ ์‚ฌ๋žŒ๋“ค์€ ์˜ค๋žซ๋™์•ˆ ์„œ๋กœ์˜ ์ฃผ์žฅ์— ๊ท€๋ฅผ ๊ธฐ์šธ์ด์ง€ ์•Š๊ณ  ๋ฉˆ์ถ”์—ˆ๊ณ  ๊ฒฐ๊ตญ ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€ TS ํŒ€์˜ ๊ด€์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๋…ผ์˜๋ฅผ ์ค‘๋‹จํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@fdecampredon
๋‚ด ์š”์ ์— ๋Œ€ํ•œ ๋ถ€๋ถ„๊ณผ ๊ด€๋ จํ•˜์—ฌ #1800์— ๊ท€ํ•˜์˜ ์ฃผ์žฅ์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง„์‹ฌ์œผ๋กœ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์™œ ๊ทธ๊ฒƒ์ด ๋‚˜์œ ๋””์ž์ธ์ธ์ง€ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ๊ด€์ ์„ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋…ผ์˜๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ์ฒ˜์Œ์— #1800์„ ๋งŒ๋“  ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์™€ ๊ด€๋ จํ•˜์—ฌ ๋…ผ์˜๊ฐ€ ์•„๋ฌด๋ฐ๋„ ์ง„ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค...

๋‚ด ์ด์ „ ์˜๊ฒฌ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ง๋กœ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ช‡ ๋ฒˆ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ๋” ์‹œ๋„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

declare function err():string;

null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด typescript๋Š” ํ•ญ์ƒ ๊ธฐ๊บผ์ด err().split(' ') ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. "๊ทธ๊ฒƒ์€ ์œ ํšจํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ ํ›„์— string ๋ฅผ ?string ๋˜๋Š” string|null ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ณ€๊ฒฝ ์ „์— ๊ฐ€์ง€๊ณ  ์žˆ๋˜ _์•„๋ฌด๊ฒƒ๋„ ์žƒ์ง€ ์•Š์Šต๋‹ˆ๋‹ค_:

๋ณ€๊ฒฝ ์ „์— null ๊ฒ€์‚ฌ๊ฐ€ ์—†์—ˆ๊ณ  ์ดํ›„์—๋„ ์—†์Šต๋‹ˆ๋‹ค(์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ). ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋œ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋” ํฐ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์‹œ์—ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์ „์— null ๊ฒ€์‚ฌ๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋ณ€๊ฒฝ ํ›„์—๋Š” _ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@fdecampredon ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋งŽ์€ ์˜คํ•ด๊ฐ€ ์žˆ๊ณ  ์ด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ "์–ด๋ ต๊ณ " "์—„๊ฒฉํ•œ" ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด ๋งŽ์€ ์˜คํ•ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ•˜๊ฒŒ ๊ณผ์žฅ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํฌํฌ์—์„œ --noImplicitNull ์˜ ๊ธฐ๋ณธ ๋ณ€ํ˜•์„ ์‹œ๋„ํ•˜๊ณ  ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ๊ฐ„์— ์‹œ๊ฐ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ์„์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. , ์žฌ๋ฏธ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@spion , ๋‚˜๋Š” null์ด null ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ชจ๋‘

๊ทธ๋ฆฌ๊ณ  @fdecampredon ๋‚ด ์œ ์ผํ•œ ์š”์ฒญ์€ ํฐ ๋ณ€ํ™”๊ฐ€ ์—†๋Š” ๊ฒƒ, ํŠนํžˆ ์˜ค๋ฅ˜๊ฐ€ ์ž˜๋ชป๋œ ์œ„์น˜์— ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์˜ˆ์ œ์—์„œ @spion ์ด ํ• ๋‹น๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ null ํ—ˆ์šฉ ๋ฐ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ณ€ํ™˜๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด ์ง€๊ธˆ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ Typescript๋ฅผ ๊ณ„์† ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. null์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์Œ, ์ด์ „์— nullable ์ดˆ๊ธฐ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ทธ ์˜ˆ๋ฅผ ์ œ์™ธํ•˜๊ณ .

@spion
๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์—์„œ ์ œ๊ฐ€ ์ดํ•ดํ•œ ๋‚ด์šฉ์ด ์ด์ „์— ์ดํ•ดํ•œ ๋‚ด์šฉ๊ณผ ๋งŽ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค...

๋”ฐ๋ผ์„œ : string ๋Š” " <any> ๊ฐ€ ์œ ํ˜• ์ •ํ™•์„ฑ์„ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ null ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๋Š” ์ด์ „ ๋ฌธ์ž์—ด ์œ ํ˜•"์ž…๋‹ˆ๋‹ค.

์ƒˆ ๊ตฌ๋ฌธ : string | null ์€ ์ด์ „์— ์กด์žฌํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉฐ null ๊ฒ€์‚ฌ ์—†์ด ์ด ํ˜•์‹์— ์•ก์„ธ์Šคํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ณ  ๋ชจ๋“  ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํ•œ๋™์•ˆ ์ƒ๊ฐํ•ด๋ด์•ผ๊ฒ ๋„ค์š”.

๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅด๋Š” ์งˆ๋ฌธ์€ ์ž…๋ ฅ ๊ฐ’(์˜ˆ: ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜)์— ์ œ์•ฝ ์กฐ๊ฑด์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

declare f(x: string): void;
f(null);

์ด๊ฒŒ ์ •์ƒ์ธ๊ฐ€์š” ์˜ค๋ฅ˜์ธ๊ฐ€์š”? ๊ดœ์ฐฎ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

_๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด ํ† ๋ก ์—์„œ ์žƒ์–ด๋ฒ„๋ฆฐ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด๋กœ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ๊ฑฐ๊ธฐ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค._

@jods ์˜ค๋ฅ˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

declare f(x: string): void; //string must not be null.
declare f(x: string|null): void; //string may be null (not sure about undefined here).
declare f(x?: string): void; //I assume x may be null or undefined.

@jods4 ํ•˜๋‚˜์˜ ์ฃผ์ œ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด 10๊ฐœ์˜ ๋‹ค๋ฅธ ์ œ์•ˆ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ƒํ™ฉ์„ ์ถ”์ ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค/10๊ฐœ์˜ ๋‹ค๋ฅธ ์ œ์•ˆ์— ๊ตฌ๋… . ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ ๋ชจ๋‘ ์†Œ๊ฐœ์— ๋‹ค๋ฅธ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์ฐพ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ•˜๋‚˜๋ฅผ ๋ณด๊ณ  ํˆฌํ‘œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@fdecampredon ๋งŽ์€ ๊ฒŒ์‹œ๋ฌผ๊ณผ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ๋ชจ๋‘๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๊ฒƒ์„ ์ค‘๋‹จํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ์ด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์Šค์Šค๋กœ ์„ค๋ช…ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ•ด๋‹น ์ฃผ์ œ์—์„œ ๊ตฌ๋…์„ ์ทจ์†Œํ•˜๋Š” ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

@๊ทธ๋ฆฌํฌํฌ
ํ•˜์ง€๋งŒ ๋งˆ๋ฒ•์˜ ๊นƒ๋ฐœ์„ ์ผ  ํ›„์—์•ผ, ๊ทธ๋ ‡์ง€?
๋”ฐ๋ผ์„œ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„๋ฉด ์ด์ „์— ์กด์žฌํ•˜์ง€ ์•Š์•˜๋˜ ์ƒˆ๋กœ์šด nullable ์œ ํ˜•์„ ์ œ์™ธํ•˜๊ณ  ๊ฒ€์‚ฌ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ผœ๋ฉด ๋ชจ๋“  ์œ ํ˜•์ด nullable์ด ์•„๋‹ˆ๋ฉฐ ํ™•์ธ๋ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ์•„๋งˆ๋„ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. _ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์˜ค๋Š˜๋‚  ์กด์žฌํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๊นจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค._ 300K ๋ผ์ธ์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค... ํ”Œ๋ž˜๊ทธ๋ฅผ ์ผœ๊ธฐ ์ „์— ์œ ํ˜•์ด ์‹ค์ œ๋กœ nullable์ธ ๋ชจ๋“  ๊ณณ์— nullable ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ๋Œ€๋‹จํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ์ƒˆ ํ”„๋กœ์ ํŠธ( .d.ts ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด)์— ์ข‹์ง€๋งŒ ๊ธฐ์กด ์ฝ”๋“œ์—๋Š” ๋งค์šฐ ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

@Griffork ์ด ๋‹จ์ผ ๋ฌธ์ œ์™€ ๊ธด ์ฃผ์„ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋‚ด ๋ฌธ์ œ๋Š” ๋‹จ์ผ ์ œ์•ˆ์— ๋Œ€ํ•ด ์ง‘์ค‘์ ์ธ ํ† ๋ก ์„ ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 3~4๊ฐœ์˜ ๋ฌธ์ œ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๊ฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@spion ์˜ ์›๋ž˜ ์ œ์•ˆ์—๋Š” ๋งˆ๋ฒ•์˜ ๊นƒ๋ฐœ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. typescript๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ํ•ต์‹ฌ์ ์ธ ๋ณ€๊ฒฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ํ•˜์ง€๋งŒ ์ด ํ† ๋ก ์— ์ฐธ์—ฌํ•˜๋Š” ์‚ฌ๋žŒ์€ ์ด์ „์— ๋‚˜์˜จ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ด์ „์— ๋‚˜์˜จ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ฝ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด(๋”ฐ๋ผ์„œ ์ž ์žฌ์ ์œผ๋กœ ๋™์ผํ•œ ์ œ์•ˆ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Œ) _๊ทธ๋Ÿฌ๋ฉด_ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•œ ์žฅ์†Œ์— ์žˆ๋Š” ๊ฒƒ์˜ ์š”์ ์€ ๋น„๋ก ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ์„ธ๋ถ€์‚ฌํ•ญ์ด๋‚˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์ฃผ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ™์€ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.
๋ชจ๋“  ๋Œ€ํ™”๋Š” ์ค‘์•™ ์ง‘์ค‘ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ์‘๋‹ตํ•˜์ง€ ์•Š์Œ์œผ๋กœ ์ธํ•ด ๋ฌปํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์ œ์•ˆ์ด ํ˜„์žฌ ๋…ผ์˜ ์ค‘์ธ ๋‹ค์–‘ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ž์ฃผ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ ์ด ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ์„œ๋ฅผ ์„œ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฒฐํ•จ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ์ด๋™ํ•˜์—ฌ ์ž‘์„ฑํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ๋žŒ๋“ค์€ ์„œ๋กœ์˜ ์‹ค์ˆ˜๋กœ๋ถ€ํ„ฐ ๋ฐฐ์šฐ์ง€ ์•Š๊ณ , ์‚ฌ๋žŒ๋“ค์€ ํ•œ ํ† ๋ก ์— ์ž์‹ ์„ ๊ฒฉ๋ฆฌํ•˜๊ณ  ๋‹ค๋ฅธ ํ† ๋ก ์—์„œ ์š”์•ฝ๋œ ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ(๊ทธ๋“ค์ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค)์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ ์€: ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๋ฉด ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒŒ์‹œ๋ฌผ์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์—†๋Š” ์‹œ์ฒญ์ž ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์€ ๊ฒŒ์‹œ๋ฌผ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ชจ๋“  ๊ด€๋ จ ๊ฒŒ์‹œ๋ฌผ์ด ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒŒ์‹œ๋ฌผ์„ ์—ฐ๊ฒฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •). ).

๋˜ํ•œ @jods4๋Š” null์„ ํ• ๋‹นํ•  ๋•Œ๋งŒ

null์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ๋‹จ์ผ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์˜ ์ด์ ์„ ์–ป๊ธฐ ์ „์— ํ™•์ธ/์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ˆ๋ณด๋‹ค ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ @jods4 ๋ฐ @spion ์˜ ์ œ์•ˆ์— ๋Œ€ํ•œ "์—…๊ทธ๋ ˆ์ด๋“œ" ํ”„๋กœ์„ธ์Šค์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ผœ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •).

function a(arg1: string): string;
a("mystr").toLowerCase(); //errors in <strong i="11">@jods4</strong>'s proposal because a may return null.
a("mystr").toLowerCase(); //fine in <strong i="12">@spion</strong>'s proposal.

a(null).toLowerCase(); //fine in <strong i="13">@jods4</strong>'s proposal because a may accept null.
a(null).toLowerCase(); //errors in <strong i="14">@spion</strong>'s proposal since a doesn't accept null.

๊ฒฐ๊ตญ ๋‘˜ ๋‹ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊นจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋””๋ฒ„๊ทธํ•˜๊ธฐ ํž˜๋“ค์ง€๋งŒ ๋ณ€์ˆ˜ ์„ ์–ธ ๋Œ€์‹  ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ํ•˜๋‚˜๋Š” null์ด ๋ฌด์–ธ๊ฐ€์— ํ• ๋‹น๋  ๋•Œ(@spion) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” null์ด ๋ฌด์–ธ๊ฐ€์— ํ• ๋‹น๋˜์ง€ ์•Š์„ ๋•Œ(@jods4) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์‚ฌ๋ฌผ์— null์„ ํ• ๋‹นํ•˜์ง€ ์•Š์„ ๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ์ž์ฃผ null์„ ํ• ๋‹นํ•˜๋ฏ€๋กœ @spion ์€ ๋‚ด๊ฐ€ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ๋“ค:

  • ๋ณ€์ˆ˜ ์œ ํ˜•์ด ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•œ๋‹ค๋ฉด ํ๋ฆ„์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
var s: string;
s.toUpperCase(); // error
var t = (s || "test").toUpperCase(); // ok. Inferred t: string
yes(t);  // ok
t = no();
yes(t);  // error

๊ฐœ์ธ์ ์œผ๋กœ ์œ ํ˜•์˜ ์•”์‹œ์  ๋ณ€๊ฒฝ์ด ์•„๋‹ˆ๋ผ no()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • ์ผ๋ถ€ ๊ธฐํ˜ธ๋ณด๋‹ค null์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋œ Nullable์€ ์ฝ๊ธฐ ์‰ฝ๊ณ  ๊ธฐ์–ตํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ •๋ง๋กœ ! "not-null"์ด ์•„๋‹Œ "not"์— ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‘๋ฌธ์ž์–ด๊ฐ€ ์‹ซ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๊ธฐํ˜ธ๊ฐ€ ํ•˜๋Š” ์ผ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋‘๋ฌธ์ž์–ด๋ฅผ ๊ธฐ์–ตํ•  ์ˆ˜ ์—†๊ณ  ์ž‘์—… ์†๋„๊ฐ€ ํฌ๊ฒŒ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค.

@jods4 ํ˜„์žฌ ๋Œ€ํ™”๊ฐ€ ์‚ฌ๋žŒ๋“ค์ด ๋”ฐ๋ผ์žก๊ธฐ

@Griffork ์†”์งํžˆ ๋‹ค ์ฝ์—ˆ๋Š”๋ฐ ๋งŽ์€ ๋ถ„๋“ค์ด ์ฝ์œผ

nullable์ธ ํ•ญ๋ชฉ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค(์ด๋Š” ํŠน์ • ์‹œ์ ์—์„œ null์ด ํ• ๋‹น๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹ค์ œ๋กœ nullable์ด ์•„๋‹˜). null์ด ํ•จ์ˆ˜์— ํ• ๋‹น/์ „๋‹ฌ๋˜์ง€๋งŒ ์ˆ˜์ • ์‚ฌํ•ญ์€ ์„ ์–ธ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํ•จ์ˆ˜ ์„ ์–ธ, ๋ณ€์ˆ˜ ์„ ์–ธ, ํด๋ž˜์Šค์˜ ํ•„๋“œ ์„ ์–ธ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค... ๋งŽ์€ ๊ฒƒ๋“ค์ด ์ž ์žฌ์ ์œผ๋กœ ๊ฒ€ํ† ๋˜๊ณ  ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jods4 ์‹ค์ œ ํ•ต์‹ฌ ์ •๋ณด๊ฐ€ ์•„๋‹ˆ๋ผ ์‹คํ˜„๋˜์ง€ ์•Š์€ ํ•˜์œ„ ํ† ๋ก ์ด ๋ถ„๊ธฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ ๋Œ์•„๊ฐ€์„œ ๋ฐ”๊พธ๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค.

@spion '-nonImplicitNull' ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” @RyanCavanaugh ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ?type type|null ๋˜๋Š” type|undefined ํ—ˆ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@fdecampredon ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์ด ํ•„์š”ํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ๋” ์—„๊ฒฉํ•œ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ์— ์˜์กดํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๋น„์—„๊ฒฉํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

@jods4

declare f(x: string): void;
f(null);

์ œ์•ˆ๋œ --noImplicitNull ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ, ์˜ค๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„์ง ๊ณต์‹ ์ œ์•ˆ์„ ์—ฌ๋Š” ๊ฒƒ์ด ํŽธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ๊ณ  ์‹คํ—˜์„ ๋” ํ•˜๊ฑฐ๋‚˜ ํฌํฌ์—์„œ ์•„์ด๋””์–ด์˜ ๋” ๊ฐ„๋‹จํ•œ ๋ฒ„์ „์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

!T ์ œ์•ˆ์ด ์‹ค์ œ๋กœ ๋งŽ์€ ์ฝ”๋“œ๋„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์œ ํ˜•์˜ ์˜๋ฏธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๋ถ„์„์ด ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ซ์•˜๋‹ค. ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๊นจ๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์ด ๋” ๊น”๋”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์ œ ๋งŽ์€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ์ด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„์ง ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ์ฝ”๋“œ์— ์—ฌ์ „ํžˆ ์ข‹๊ณ  ์•„๋งˆ๋„ ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•œ null ๊ฒ€์‚ฌ์˜ ์ด์  ์—†์ด ๊ณ„์† ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์˜ค๋Š˜๋‚ ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋‹จ์ ๊ณผ ์žฅ์ ์— ๋Œ€ํ•œ ๊ณต์‹ TSํŒ€์˜ ์ž…์žฅ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

"๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ null ํ—ˆ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •"๋งŒํผ ํฐ ํœด์‹์„ ์ทจํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋ฒ„๊ทธ์ธ ๊ฒฝ์šฐ์— ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๋ฅผ _only__ ๋ฐœํ–‰ํ•˜๋Š” ์ œ์•ˆ์ด ์žˆ์—ˆ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ํ…Œ์ด๋ธ”์— ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋Ÿฐ ์ œ์•ˆ์€ ์˜ค๊ธฐ ํž˜๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค :wink:

์˜ํ–ฅ ๋ฒ”์œ„๊ฐ€ ๋” ์ž‘์œผ๋ฉด null ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ๋•Œ ๊ณผ๋ถ€ํ•˜ ํ•ด๊ฒฐ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์˜ˆ: ์ •ํ™•ํ•œ ๋™์ž‘์ด ๋ฐ˜๋“œ์‹œ ์ฆ‰์‹œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)์˜ ๊ฒฝ์šฐ ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

:+1: ์ •์ƒ์ธ ๊ฐ์ง€๋จ:

๊ธฐ์กด์˜ ์ž‘๋™ ๋ฐฉ์‹์—๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์ง€๋งŒ ๊ณต์šฉ์ฒด์— null ์œ ํ˜•์ด ๋„์ž…๋˜์–ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—(๋˜๋Š” null์ด ์•„๋‹Œ ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด์•ผ ํ•จ) ๋ณ€์ˆ˜๋ฅผ ๋ณดํ˜ธํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ธฐ๋ณธ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž…๋ ฅ๋œ ๋ณ€์ˆ˜์™€ null๋กœ ์ž…๋ ฅ๋œ ๋ณ€์ˆ˜์— ์—ฌ์ „ํžˆ null์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งˆํฌ์—…๋œ ๊ฒฝ์šฐ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ๊ฐ•์ œ๋กœ ์บ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์ง€๋งŒ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๋ก ๋œ ์ž…๋ ฅ ๋ฐ ์šฐ์ˆ˜ํ•œ ์ฝ”๋”ฉ ์‚ฌ๋ก€ ๋ชจ๋‘๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ์‹œ์Šคํ…œ์—์„œ ์—ฌ์ „ํžˆ ๋งŽ์€ ๋ฒ„๊ทธ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ (๋‚˜์ค‘์— ์•„๋งˆ?) ๋‹น์‹ ์€ (์ด ๋‹ค์†Œ ์ž‘ํ’ˆ ํ”Œ๋ž˜๊ทธ๋กœ์˜ ์ œ์•ˆ์ด ํ™œ์„ฑํ™” @spion์ฒ˜๋Ÿผ) ์ž์‹ ์˜ ์ž…๋ ฅ์˜ ํ•œ ๋ถ€๋ถ„์œผ๋กœ ๋„ (null)์ด์—†๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€๋ฅผ nullํ•˜๋Š” --noImplicitNullCast ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ชจ๋“  ์ผ๋ฐ˜ ํƒ€์ดํ•‘๊ณผ --noImplicitAny ํ”Œ๋ž˜๊ทธ์˜ ์ถ”๊ฐ€์™€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค.

@๊ทธ๋ฆฌํฌํฌ
ํŒจํ‚ค์ง€์˜ ์ „๋ฐ˜๋ถ€( null ์œ ํ˜• ์ถ”๊ฐ€ ๋ฐ ๋ณดํ˜ธ ์—†์ด ์—ญ์ฐธ์กฐ ๊ธˆ์ง€)๋Š” 100% ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฑธ ๊ณ ๋ คํ•˜์„ธ์š”:

์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์œผ๋กœ ๋‚ด์žฅ๋œ ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ ๋งŽ์€ lib defs๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ null์„ ๋ช…์‹œ์ ์œผ๋กœ ํฌํ•จํ•˜๋„๋ก ์ผ๋ถ€ ์„œ๋ช…์„ ๋ณ€๊ฒฝํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ:

interface Array<T> {
  find(predicate: (T) => bool) : T | null;
  pop() : T | null;
}
interface Storage {
  getItem(key: string) : any | null;
}

: ๋งŽ์€ ๋“ฑ์˜ API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค find ๋ฐ˜ํ™˜ undefined ์—๋Š” ๋ฐฐ์—ด ์š”์†Œ๊ฐ€ ์กฐ๊ฑด๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, pop ๋ฐ˜ํ™˜ undefined ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ๋Š” ๊ฒฝ์šฐ, localStorage.getItem ๋˜๋Š” sessionStorage.getItem ํ‚ค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋‘˜ ๋‹ค null ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” ํ•ฉ๋ฒ•์ ์ด๊ณ  ์ด์ „์— ์™„๋ฒฝํ•˜๊ฒŒ ์ปดํŒŒ์ผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

var xs: string[];
if (xs.length > 0) return xs.pop().trim();  // error xs.pop() may be undefined (false positive)

var items : { id: number }[];
var selectedId : number;
// Assume we are sure selectedId is amongst items
var selectedItem = items.find(x => x.id === selectedId);
selectedItem.toString(); // error selectedItem may be undefined (false positive)

localStorage ์—์„œ ๊ฑฐ๊ธฐ์— ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฐ™์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์ฃผ๋ณ€์— ๊ทธ๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์žˆ์œผ๋ฉฐ ์ด์ œ ์ปดํŒŒ์ผํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์— ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์บ์ŠคํŠธ(๋˜๋Š” ์ผ๋ถ€ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด null์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์‹ค์ œ ๋ฒ„๊ทธ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—๋Š” ๋งŽ์€ ์˜คํƒ์ง€๊ฐ€ ํฌํ•จ๋˜๋ฉฐ ์ด๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. 100K+ LOC์—์„œ๋Š” ์‚ฌ์†Œํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ ๋˜๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ์ด์ „ ์ฝ”๋“œ๋Š” null ๊ฒ€์‚ฌ๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋Š” ์ „ํ˜€ ์ด์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜(--enableNullAnalysis)์— ์˜ํ•ด ๊ตฌ๋™๋˜๋ฉฐ "์ „ํ™˜" ๋˜๋Š” "ํ”„๋กœ๊ทธ๋ ˆ์‹œ๋ธŒ" ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝ๋กœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋„ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ญ์ƒ ํ”„๋กœ์ ํŠธ์˜ lib.d.ts๋ฅผ ๊ณ ์ •ํ•˜๊ฑฐ๋‚˜ ์ด์ „ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ํƒ€์ดํ•‘์€ ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ทธ๋ ‡๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„์ž…๋  ๋•Œ ๊ฑฐ์˜ ๋ชจ๋“  ์ƒˆ๋กœ์šด ํƒ€์ดํ•‘์€ ์ด์ „ ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์‹์œผ๋กœ๋“  ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๊ณต์šฉ์ฒด, ์ œ๋„ค๋ฆญ).
์ด ๋ณ€๊ฒฝ์€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ฝ”๋“œ ์ •์˜๋ฅผ ๊ณ ์ •ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ณ ํ†ต์„ ๊ฒช์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ด๋ก ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ์–ด์จŒ๋“  ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ ํฐ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์žˆ์Œ). ๋ณดํ˜ธํ•˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ์— ์ˆจ์–ด ์žˆ๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ณ€๊ฒฝ์€ ๊ด‘๋ฒ”์œ„ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ์„ ์œ ๋ฐœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ํฝ๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค
@jods4 ์šฐ๋ฆฌ๊ฐ€ ์ด ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ๊ฐ์ง€ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ข…๋ฅ˜์˜ ์ฝ”๋“œ

ํŽธ์ง‘ 2
_some_ (์ž˜๋ชป๋œ/์•ˆ์ „ํ•˜์ง€ ์•Š์€) ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด ์ด ์ฃผ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค .

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋‹จ์ง€ ๊ตฌ๋ฌธ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒƒ์ด ์—ฌ์ „ํžˆ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ปดํŒŒ์ผ๋˜๊ณ  ๋ชจ๋“  ๊ณณ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

_์ƒˆ๋กœ ์ž…๋ ฅํ•˜๋ฉด ์ด์ „ ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋˜์ง€๋งŒ ์–ด์จŒ๋“  ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค._

๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์„ ์ œ์™ธํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ๋ฐ ๊ณต์šฉ์ฒด๋Š” lib.d.ts ์†Œ๋น„์ž๊ฐ€ ์ƒˆ ๋ฒ„์ „์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ lib.d.ts์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์‚ฌ๋žŒ๋“ค์€ ์ด์ „ ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ์†์ƒ์‹œํ‚ค๋Š” ์–ธ์–ด ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ฃผ์š” ์–ธ์–ด์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ). ์ด์— ๋Œ€ํ•œ ์˜ˆ์™ธ๊ฐ€ ๊ฐ€๋” ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์€ ๊ฑฐ์˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ž์ฃผ ์šฐ๋ฆฌ๊ฐ€ ๊นจ๋œจ๋ฆฌ๋Š” ์ฝ”๋“œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ๋Š” ๊ฒฝ์šฐ ๋ฒ„๊ทธ.

๊ทธ๋Ÿฌ๋‚˜ ํ•ญ์ƒ ํ”„๋กœ์ ํŠธ์˜ lib.d.ts๋ฅผ ๊ณ ์ •ํ•˜๊ฑฐ๋‚˜ ์ด์ „ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

lib.d.ts(๋ฐ BTW๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ .d.ts)๋ฅผ ๋™๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ƒˆ๋กœ์šด HTML API์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€๋ณ๊ฒŒ ์ƒ๊ฐํ•  ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด๋ก ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ์–ด์จŒ๋“  ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ ํฐ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์žˆ์Œ). ๋ณดํ˜ธํ•˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ์— ์ˆจ์–ด ์žˆ๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

JS๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋งŽ์€ ๊ฒฝ์šฐ์— undefined (๋˜๋Š” ๋•Œ๋กœ๋Š” null )๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ „ํ†ต์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ์˜ˆ๋Š” Array.prototype.pop ์ž…๋‹ˆ๋‹ค. C#์—์„œ ๋นˆ ์Šคํƒ์—์„œ ํ„ฐ์ง€๋Š” ๊ฒƒ์€ ๋˜์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ญ์ƒ ์œ ํšจํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Javascript์—์„œ ๋นˆ ๋ฐฐ์—ด์„ ํŒํ•˜๋ฉด undefined ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์—„๊ฒฉํ•˜๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ๋“  ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋Œ€๋‹ตํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์—ˆ๊ณ , ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ํ•ฉ๋ฒ•์ ์ด๊ณ  ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ๋Š” api๊ฐ€ ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ null์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์˜ˆ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํŠน์ • ๊ฒฝ์šฐ์—๋Š” ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ์•ˆ์ „ ๊ฒ€์‚ฌ๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ•œ ์‹œ๊ฐ„ ์ „์— ์–ด๋–ค ๋„์„œ๊ด€์˜ ๋งˆ์ดํฌ๋กœ ์ž‘์—… ๋ถ€๋ถ„์„ ๋ณด๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๋ถ€๋ถ„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class MicroTasks {
  queue: Array<() => void>;

  flushQueue() {
    while (queue.length > 0) {
      let task = queue.pop();
      task();  // error possible null dereference (not!)
     }
  }
}

์ด๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ 2์™€ ๊ด€๋ จํ•˜์—ฌ: ์˜ˆ, ์ด ๋ณ€๊ฒฝ์ด ๋ฒ„๊ทธ๋ฅผ ์žก์•„๋‚ด๊ณ  ์œ ํšจํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ง€์ ํ•˜๊ธฐ๋ฅผ _์œŒ_ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์œ ์šฉํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ๋“  ์ผ์–ด๋‚˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ์ด์œ ๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TS ํŒ€์€ _valid_ ์ฝ”๋“œ์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฒฐ์ •ํ•ด์•ผ ํ•  ์ ˆ์ถฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@danquirk Fair ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๊ธฐ๋Šฅ์€ ์ ˆ๋Œ€ ๊ตฌํ˜„๋  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
@jods4 ๋ฌด์Šจ ๋ง์ธ์ง€ ์ดํ•ดํ•˜์ง€๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ ๋Š” nullable์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์Šฌํ”„๊ฒŒ๋„, ๋งˆ์นจ๋‚ด ๊ทธ ๋ฌธ์ œ๋ฅผ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์•„๋งˆ.

nullable ๋ฐ non-nullable ์ธ์ˆ˜๋ฅผ ํ”ผํ•œ๋‹ค๋ฉด ...

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ จ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ(๋˜๋Š” ์™„ํ™”)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • null-typeguard ๊ธฐํ˜ธ ์†Œ๊ฐœ ?<type>
    ์œ ํ˜•์— ์ด ๊ธฐํ˜ธ๋กœ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ๊ฒฝ์šฐ ์ง์ ‘ ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

``` ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
var foo: ?๋ฌธ์ž์—ด;

foo.indexOf('s'); // ์˜ค๋ฅ˜
foo && foo.indexOf('); // ๊ดœ์ฐฎ์•„
```

  • ๊นƒ๋ฐœ ์†Œ๊ฐœ --nouseofunassignedlocalvar

``` ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ
var foo: ๋ฌธ์ž์—ด;

foo.indexOf('s'); // ์˜ค๋ฅ˜

foo = '๋ฐ”';

foo.indexOf('s'); // ๊ดœ์ฐฎ์•„
```

ํฅ๋ฏธ๋กœ์šด ์—ญ์‚ฌ์  ๋ฉ”๋ชจ : ์ด์— ๋Œ€ํ•œ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•˜๋Š” ๋™์•ˆ 2013๋…„ 2์›”์— --cflowu ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์–ธ๊ธ‰ํ•˜๋Š” codeplex์˜ ์˜ค๋ž˜๋œ ๋ฌธ์ œ ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. @RyanCavanaugh , ๊ทธ ๊นƒ๋ฐœ์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

  • ์•ˆ์ „์šดํ•ญ ์˜คํผ๋ ˆ์ดํ„ฐ #16์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•˜๋ฉด ์‹ค์ œ๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์‹ ๊ฒฝ ์‡ ์•ฝ์„ ์ผ์œผํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ null ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ๋œ ๋” ๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

@NoelAbrahams :
๋‹น์‹ ์˜ ์ฒซ ๋ฒˆ์งธ ์ œ์•ˆ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚˜์˜ ๋งˆ์ง€๋ง‰ ์ œ์•ˆ๊ณผ ์™„์ „ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹จ์ง€ ? |null ๋Œ€์‹ ( lib.d.ts ์—…๋ฐ์ดํŠธ ๋ฐ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ

๋‘ ๋ฒˆ์งธ ์ œ์•ˆ์—๋Š” @RyanCavanaugh (์œ„)๊ฐ€ ์ด์ „์— ํ•ด๊ฒฐํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ธ์–ด์˜ ์˜๋ฏธ๋ฅผ ๋ฐ”๊พธ๋Š” ํ”Œ๋ž˜๊ทธ๋Š” ์œ„ํ—˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ํšจ๊ณผ๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ๋งค์šฐ ๋น„๊ตญ์†Œ์ ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
...[ํ•œ์กฐ๊ฐ]...
ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ์˜ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ํ˜„์žฌ noImplicitAny๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”Œ๋ž˜๊ทธ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์œ ์‚ฌํ•˜์ง€ ์•Š์€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋” ์ผ์ฐ ์ œ์•ˆ ๋˜์—ˆ๊ณ  @RyanCavanaugh ์˜ ์˜๊ฒฌ ๋•Œ๋ฌธ์— ํฌ๊ธฐ

์„ธ ๋ฒˆ์งธ ์ œ์•ˆ์€ ํ˜„์žฌ ์ฃผ์ œ์™€ ๊ฑฐ์˜ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค(๋” ์ด์ƒ ์ž…๋ ฅ ๋ฐ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ํฌ์ฐฉ). ๋‚ด๊ฐ€ ์ด๋ ‡๊ฒŒ ๋งํ•˜๋Š” ์ด์œ ๋Š” ์ด ์ฃผ์ œ๊ฐ€ ์ƒ์„ฑ๋œ ์ด์œ ๋Š” ์ƒˆ๋กœ์šด null์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  "์•ˆ์ „ํ•œ" ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ •์˜๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ null ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š”์„ฑ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒ€์‚ฌ๊ฐ€ ๋„์ฒ˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ์ œ์•ˆ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  nullable(๋ฐ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์„ ์‚ฌ์šฉํ•˜๋„๋ก lib.d.ts๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์›ํ•˜๋Š” ๊ฒฝ์šฐ nullable์ด ์žˆ๋Š” ์ž์ฒด ๋ฒ„์ „์„ ์œ ์ง€/์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘ํ•˜๋‹ค:
ํŠนํžˆ ๋ชจ๋“  libs์—๋Š” ์ตœ์‹  ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ typeguard๊ฐ€ ํ•„์š”ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋œ ํ˜•์‹์€ ์—†์Šต๋‹ˆ๋‹ค.

@RyanCavanaugh (ํŠนํžˆ .d.ts ํŒŒ์ผ์ด ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ) ๊ทธ๋‹ค์ง€ ํฐ ๋ณ€ํ™”๊ฐ€ ์•„๋‹˜์„ ๋ณด์—ฌ์ฃผ๋Š” ํŒจ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ์™€์„œ ๋…ผ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@danquirk ์œ ํ˜• ์ •์˜๋Š” ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. "์ž˜๋ชป๋œ" ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ด ๋ฌธ์ œ๋Š” ์žƒ์–ด๋ฒ„๋ฆฐ ์›์ธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋ฌด์—‡๋ณด๋‹ค๋„ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” MSR์˜ ์ˆ˜์ •๋œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ํŽธ์ง‘: ์ฐพ์•˜์Šต๋‹ˆ๋‹ค: http://research.microsoft.com/apps/pubs/?id=224900 ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๊ด€๋ จ์ด ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Griffork , ๋„ค, ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์ด ํ† ๋ก ์˜ ๊ธธ์ด๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ๋…ผ์˜๋˜์—ˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์š”์•ฝ์€ ์—ฌ๋Ÿฌ ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜์—ฌ null๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์‹ค์šฉ์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ณณ์—์„œ ์ƒˆ๋กœ์šด null ๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Œ

ํ• ๋‹น๋˜์ง€ ์•Š์€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ํŠธ๋ž˜ํ•‘ํ•˜๋ฉด ์ด๋ฅผ ์™„ํ™”ํ•˜๊ณ  ์•ˆ์ „ ํƒ์ƒ‰ ์—ฐ์‚ฐ์ž๋Š” ์ œ์•ˆ๋œ ES ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์–ด๋Š ์‹œ์ ์—์„œ TS์— ๋„์ฐฉํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์ด TS์— ๋“ค์–ด๊ฐˆ ํ™•๋ฅ ์ด ๋‚ฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ... :(

๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ํ•ด๊ฒฐ์ฑ…์€ null ์•ˆ์ „์„ ์˜ตํŠธ์ธ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒˆ๋กœ์šด T | null ๋˜๋Š” ?T ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์˜ตํŠธ์ธํ•˜์ง€ ์•Š๋Š” ํ•œ _any_ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋”ฐ๋ผ์„œ ์ƒˆ ํ”„๋กœ์ ํŠธ๋Š” ์ด์ ์„ ์–ป๊ณ  ์ฝ”๋“œ๋ฅผ ์ƒˆ ๊ธฐ๋Šฅ๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ์„ ํƒํ•œ ์ด์ „ ํ”„๋กœ์ ํŠธ๋„ ํ˜œํƒ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์ปค์„œ ์‰ฝ๊ฒŒ ์ ์‘ํ•  ์ˆ˜ ์—†๋Š” ํฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด๋„ ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค...

@NoelAbrahams ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ œ ์š”์ ์€ ๊ทธ๊ฒƒ์ด ๋‚˜์œ ์ œ์•ˆ์ด ์•„๋‹ˆ๋ผ ์ด ํ† ๋ก ์˜ ์„ ๋™์—์„œ ์›ํ•˜๋Š” ๋‹ต๋ณ€์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ€ ๋  ๋•Œ(/if) ๊ทธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ข‹์€ ์†Œ๋ฆฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์ธ์šฉํ•œ @RyanCavanaugh ์ฃผ์„๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” @jods4 (ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ฌธ์ œ๋กœ ์ธํ•œ ํ• ๋‹น ์˜ค๋ฅ˜).

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ์ œ์•ˆ ์ค‘ ํ•˜๋‚˜(์•„๋งˆ๋„ @spion 's)๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  .d.ts'์— ์ƒˆ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@๊ทธ๋ฆฌํฌํฌ
์ด๊ฒƒ์€ "๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ" ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋‚จ์•„ ์žˆ์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•ด๋„ ํ”„๋กœ๊ทธ๋žจ ์˜๋ฏธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ _์•Š๋„๋ก_ ๊ธฐ๋Šฅ์„ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋งŒ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 'not null' !T ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ•ด๊ฒฐ ๋ฌธ์ œ์™€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ‰๋‹ˆ๋‹ค.

๋˜ํ•œ T | null ๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ธ ๋ฐ˜๋ฉด ?T ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์ง€์ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jods4 ์ €๋Š” "์˜๋ฏธ๋ก  ๋ณ€๊ฒฝ"์— "ํ• ๋‹น ๋Šฅ๋ ฅ ๋ณ€๊ฒฝ"์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  (๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ @RyanCavanaugh ์˜) ๋น„-๋กœ์ปฌ ํšจ๊ณผ์— ๋Œ€ํ•œ ์šฐ๋ ค๋Š” ์—ฌ์ „ํžˆ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

@NoelAbrahams ์–ด๋–ป๊ฒŒ?
ํ‹ฐ | null์€ typeguard๊ฐ€ ํ•„์š”ํ•˜๊ณ  ?T๋Š” typeguard๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ด๋ฆ„/๊ธฐํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ๋™์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์˜ˆ, ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘˜ ๋‹ค "์ผœ์ง"์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐจ์ด๋ฅผ ๋ชป๋Š๋ผ๋‚˜์š”?

@Griffork , ๋‚ด๊ฐ€ ๋ณด๊ธฐ์— ?T ๋‹จ์ˆœํžˆ "null์„ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ์•ก์„ธ์Šคํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ๋ฅผ ์‹œํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ฃผ์„์„ ์ƒˆ ์ฝ”๋“œ์— ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ ํ˜• ์ฃผ์„์ด ์•„๋‹Œ ์ผ์ข…์˜ ์—ฐ์‚ฐ์ž๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

T|null ์ฃผ์„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํ˜•์ด nullable์ธ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

@jbondc
ํฅ๋ฏธ๋กญ๋„ค์š”... ์•„์ง ๋‹น์‹ ์˜ ์ œ์•ˆ์— ๋Œ€ํ•ด ๊นŠ์ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ทธ๋Ÿด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ ์šฉํ•˜๋Š” ๋ถˆ๋ณ€์„ฑ์€ JS์—์„œ ์Šค๋ ˆ๋”ฉ ๋ชจ๋ธ์ด ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ธˆ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋งŒํผ ํฅ๋ฏธ๋กญ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ„๋ช…ํžˆ ๋ช…์‹ฌํ•ด์•ผ ํ•  ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@NoelAbrahams
๋ชจ๋“  null ์‹œํ–‰ ์ œ์•ˆ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊นจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์„ค๋ช…ํ•œ ?T . ์œ„์˜ ๋ช‡ ๊ฐ€์ง€ ์˜๊ฒฌ์ด ์™œ ๊ทธ๋Ÿฐ์ง€ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์œผ๋กœ ๋งŒ๋“ค๊ณ  ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ณด๊ณ ๋œ ์˜ค๋ฅ˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ์ถฉ๋ถ„ํžˆ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์‚ฌ์‹ค ์ด๊ฒŒ ์ข€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. TS 1.5๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function isVoid(item:any): item is void { return item == null; }
declare externalUnsafeFunction(...):string|void

function test() {
  var res = externalUnsafeFunction(...);
  var words = res.split(' '); // error
  if (!isVoid(res)) {
    var words = res.split(' '); // ok
  }
}

์ด์ œ externalUnsafeFunction ๋˜๋Š” ๋ฐ˜ํ™˜ ์œ ํ˜•์— |void ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜ ๋˜๋Š” ํ•จ์ˆ˜ ์ •์˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ๋Œ€ํ•ด isVoid ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ•์ œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ null/undefined๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ง€์—ญ ๋ณ€์ˆ˜์™€ ํด๋ž˜์Šค ๋ฉค๋ฒ„๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•  ๋งŒํผ ๋ถ€์ง€๋Ÿฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@NoelAbrahams ๋•Œ๋ฌธ์— null ์œ ํ˜•์ด ์žˆ๋”๋ผ๋„ ๋ฏธ๋ž˜์˜ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•œ null์ด ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ์•”์‹œ์ ์œผ๋กœ ์บ์ŠคํŠธ๋˜๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ด๋ฏธ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ทธ๊ฒƒ์€ ๋ฏธ๋ž˜์— ์šฐ๋ฆฌ ๊ฐ€ ์–ธ์ œ ์–ด๋””์„œ ํ•จ์ˆ˜๊ฐ€ null์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฃผ์„์„ ๋‹ฌ๋„๋ก ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ€์ ธ์˜ฌ

๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹จ์–ด๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

@spion ์‹ค์ œ๋กœ ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ํ˜„์žฌ TS์—์„œ ์ž‘๋™ํ•œ๋‹ค๋ฉด ํ‹€๋ฆผ์—†์ด ๋ชจ๋“  ๋‚ด์žฅ d.ts ํŒŒ์ผ์ด ์ด๋ฏธ "์ž˜๋ชป" ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ œ์•ˆํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์œผ๋กœ ์ œ์•ˆํ•œ null ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•ด๋„ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ด๋ฏธ ์–ด๋Š ์ •๋„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ ์ฃผ์— ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์ž๊ณ  ์ƒ์‚ฌ์—๊ฒŒ ์ œ์•ˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ T|void ๋ฅผ ๋ฏธ๋ž˜์— ๊นจ๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ•˜๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ๋ณด์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์ฃผ์˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋„Œ์„ผ์Šค์ž…๋‹ˆ๋‹ค.

@RyanCavanaugh void === undefined(ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ๊ฐ’)๋งŒํผ ๋„Œ์„ผ์Šค์ž…๋‹ˆ๋‹ค.

ํ•œ์ˆจ์„ ์‰ฌ๋‹ค.

์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ T|void ์— ๋”ฐ๋ผ ์‹œ์ž‘ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ปค์„œ ๊ณง ์ค‘๋‹จ๋˜๊ณ  ๊ต์ฒด๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ณ ์žฅ๋‚  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์—๊ฒŒ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๋“ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข‹์•„, @spion ์ด ํŒจ์น˜๋ฅผ ๋งŒ๋“ค๋ฉด ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๋‚ด ์ž‘์—…์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ ์–ด๋„ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํ†ต๊ณ„๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@RyanCavanaugh ๋„Œ์„ผ์Šค, ์ •๋ง? ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ? ๊ทธ๋ฆฌ๊ณ  null/undefined ๊ฒ€์‚ฌ ์ „์— ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์†Œ๋น„์— ๋Œ€ํ•ด ๊ธˆ์ง€๋˜์–ด์•ผ ํ•˜๋Š” nullable ์œ ํ˜•์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ์ œ์•ˆํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๋กœ๋ถ€ํ„ฐ ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@Griffork ์–ด์จŒ๋“  1.5 ์ด์ „์—๋Š” Union์—์„œ void ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜• ๊ฐ€๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด 1.5 ์ดํ›„์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ).

์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

var foo: void;
var bar: void = doStuff();

๋‹น์—ฐํžˆ ์•„๋‹ˆ์ง€. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์˜ ํ•ฉ์ง‘ํ•ฉ์— void ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? The Void Type (3.2.4)๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์„น์…˜์—์„œ ๊ฝค ์˜ค๋žซ๋™์•ˆ ์กด์žฌํ–ˆ๋˜ ์–ธ์–ด ์‚ฌ์–‘์˜ ์ด ๋ถ€๋ถ„์„ ์ฃผ๋ชฉํ•˜์„ธ์š”.

_์ฐธ๊ณ : ์œ ์šฉํ•œ ๋ชฉ์ ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” Void ์œ ํ˜•์˜ ์„ ์–ธ ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Void๋Š” ์ œ๋„ค๋ฆญ ํ˜•์‹์ด๋‚˜ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜•์‹ ์ธ์ˆ˜๋กœ ํ—ˆ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— Void ์†์„ฑ์ด๋‚˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค._

์ด ์งˆ๋ฌธ:

_๊ทธ๋ฆฌ๊ณ  null/undefined ๊ฒ€์‚ฌ ์ „์— ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์†Œ๋น„์— ๋Œ€ํ•ด ๊ธˆ์ง€๋˜์–ด์•ผ ํ•˜๋Š” nullable ํ˜•์‹์„ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ๋ฌด์—‡์„ ์ œ์•ˆํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?_

์ „์ฒด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Ryan์€ ํ˜„์žฌ ์–ธ์–ด ์˜๋ฏธ๋ก ์— ๋”ฐ๋ฅด๋ฉด string|void ์ด ๋„Œ์„ผ์Šค๋ผ๋Š” ๊ฒƒ์„ ์ง€์ ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋„Œ์„ผ์Šค ์˜๋ฏธ๋ก ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ํ•ฉ๋ฆฌ์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” afaik ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ TS 1.5์ž…๋‹ˆ๋‹ค. ๋งž๋‚˜์š”?

๋‚˜๋Š” ํ™•์‹คํžˆ ๋„Œ์„ผ์Šค๊ฐ€ ์•„๋‹Œ ์˜ˆ๋ฅผ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” get() ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” Linq์˜ Single()๊ณผ ์œ ์‚ฌํ•œ (nodejs) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋ถˆํ–‰ํžˆ๋„ ํ•ญ๋ชฉ์„ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ ์˜ค๋ฅ˜(๊ฑฐ๋ถ€๋œ ์•ฝ์†)๋ฅผ ๋˜์ง€๋Š” ๋Œ€์‹  Promise<null> ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ฒœ ๊ณณ์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ณง ๋Œ€์ฒด๋˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์งˆ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜์™€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ˜•์‹ ๋ณดํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ํ˜•์‹ ์ •์˜๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป ์‚ฌ์šฉ๋˜๊ธฐ ์ „์— ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ๋ฉ€๋ฆฌ ์ด๋™ํ•˜๋Š” null ๊ฐ’์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์ˆ˜์‹ญ ๊ฐœ์˜ ์ถ”์ ํ•˜๊ธฐ ํž˜๋“  ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

interface Legacy { 
  get<T>(...):Promise<T|void>
}

function isVoid(val: any): val is void { return val == null; } // also captures undefined

legacy.get(...).then(val => {
  // val.consumeNormally() is a type error here
  if (!isVoid(val)) { 
    val.consumeNormally(); // OK
  }
  else { handle null case }
});

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์™„์ „ํžˆ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ void ์กฐํ•ฉํ•˜๋ ค๋ฉด ๋ชจ๋“  ์ž‘์—…๋ฉ๋‹ˆ๋‹ค val ๊ทธ๋“ค์ดํ•ด์•ผ๋กœ์„œ, ๋ฌดํšจ. typeguard๋Š” |void ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์œ ํ˜•์„ ์ขํžˆ๊ณ  T ๋ถ€๋ถ„์„ โ€‹โ€‹๋‚จ๊น๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์‚ฌ์–‘์€ void๊ฐ€ ์žˆ๋Š” ๊ณต์šฉ์ฒด์˜ ์˜๋ฏธ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

void ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค! ๋‹จ์œ„ ์œ ํ˜• ๊ฐ’์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ‘œํ˜„์‹์—์„œ(๋ชจ๋“  ๊ฒƒ์˜ 2์„ธํŠธ๊ฐ€ ํ•„์š”ํ•œ C#์˜ void์™€ ๋‹ฌ๋ฆฌ: ํ•˜๋‚˜
์ž‘์—… ๋ฐ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด). ๋นˆ์นธ์œผ๋กœ ๋†”๋‘์„ธ์š”, ์•Œ์•˜์ฃ ?
2015๋…„ 1์›” 27์ผ ์˜คํ›„ 8์‹œ 54๋ถ„์— "Gorgi Kosev" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” afaik ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ TS 1.5์ž…๋‹ˆ๋‹ค. ๋งž๋‚˜์š”?

๋‚˜๋Š” ํ™•์‹คํžˆ ๋„Œ์„ผ์Šค๊ฐ€ ์•„๋‹Œ ์˜ˆ๋ฅผ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š”
๋ถˆํ–‰ํžˆ๋„ Linq์˜ Single()๊ณผ ์œ ์‚ฌํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜
๋ฐ˜ํ™˜ ์•ฝ์†๋Œ€์‹  ์˜ค๋ฅ˜(๊ฑฐ๋ถ€๋œ ์•ฝ์†)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
ํ•ญ๋ชฉ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ˆ˜์ฒœ ๊ฐœ์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๊ต์ฒด๋˜๊ฑฐ๋‚˜ ๊ณง ์‚ฌ๋ผ์งˆ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์“ฐ๊ณ  ์‹ถ๋‹ค
๋‚˜์™€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ์œ ํ˜• ์ •์˜
๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šด ์ˆ˜์‹ญ ๊ฐ€์ง€ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
์ด์ „์— ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ๋ฉ€๋ฆฌ ์ด๋™ํ•˜๋Š” null ๊ฐ’์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค.
์ž˜๋ชป ์†Œ๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๋ ˆ๊ฑฐ์‹œ {
๊ฐ€์ ธ ์˜ค๊ธฐ(...):์•ฝ์†ํ•˜๋‹ค
}
function isVoid(val: any): val is void { return val == null; } // ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ๋„ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค.

legacy.get(...).then(๋ฐœ => {
// val.consumeNormally()๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
if (!isVoid(val)) {
val.consumeNormally(); // ํ™•์ธ
}
else { null ์ผ€์ด์Šค ์ฒ˜๋ฆฌ }
});

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์™„์ „ํžˆ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋ถ€๋ถ„์ธ์ง€ ์ง€์ ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?
๋ฌด์˜๋ฏธํ•œ ๋ง?

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -71767358
.

๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ T|void ๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์œ ํ˜•๊ณผ ๊ทธ ํ•˜์œ„ ์œ ํ˜•์˜ ํ•ฉ์ง‘ํ•ฉ์ด ๋‹จ์ˆœํžˆ ์ƒ์œ„ ์œ ํ˜•๊ณผ ๋™์ผํ•˜๋‹ค๋Š” ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Cat|Animal ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Animal . void ๋ฅผ null / undefined ๊ฐ’์— ๋Œ€ํ•œ ๋Œ€์šฉ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. null ๋ฐ undefined ์ด T ๋„๋ฉ”์ธ _ ๋ชจ๋“  T , ์ด๋Š” T ํ•˜์œ„ ์œ ํ˜•์ด์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, T|null|undefined , ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋ฏธ T ๋กœ ์ถ•์†Œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. void ๋ฅผ null|undefined ๋Œ€ํ•œ ์ฃผ๋ฌธ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ทธ๋žฌ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” T|void ๋ฅผ ์ด๋ฏธ T ๋กœ ์ถ•์†Œํ–ˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ด๊ฒƒ์„ ์ฝ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf

Void ์œ ํ˜•์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ๊ฐ’์€ null ๋ฐ undefined์ž…๋‹ˆ๋‹ค. Void ์œ ํ˜•์€ Any ์œ ํ˜•์˜ ํ•˜์œ„ ์œ ํ˜•์ด๊ณ  Null ๋ฐ Undefined ์œ ํ˜•์˜ ์ƒ์œ„ ์œ ํ˜•์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Void๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ฒ˜๋Ÿผ; T|void ์—์„œ T ๋Š” ํŠนํžˆ void ์˜ ์ƒ์œ„ ์œ ํ˜•์ด _์•„๋‹™๋‹ˆ๋‹ค_ (์‚ฌ์–‘์— ๋”ฐ๋ผ) ์œ ์ผํ•œ ์ƒ์œ„ ์œ ํ˜•์€ any ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๊ทธ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

Edit2: ๋‹น์‹ ์ด ๋งํ•œ ๊ฒƒ์„ ๋‹ค์‹œ ์ฝ์œผ์‹ญ์‹œ์˜ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ(๋ฌธ์„œ์— void๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ) ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ ๋ฌธ์„œ์˜ ์ผ๋ฐ˜์ ์ธ(๋˜๋Š” ์˜ฌ๋ฐ”๋ฅธ) ํ•ด์„์œผ๋กœ ๊ฐ€์ •๋˜๋Š” ๊ฒƒ์—์„œ๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@RyanCavanaugh ๋‚˜๋Š” ๊ธฐ๋Šฅ์ด ์ค‘๋‹จ๋  ๋•Œ๊นŒ์ง€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ์—๋Š” ๋งŽ์€ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  T|null|undefined ๋ฅผ T ๋กœ ์ถ•์†Œํ•˜๋Š” ๊ฒƒ์€ "์ด์น˜์— ๋งž๋Š”" ๋ฐ˜๋ฉด T|void ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์•„์ด๋Ÿฌ๋‹ˆ๋ฅผ ์ง€์ ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (์ŠคํŽ™์— ๋Œ€ํ•œ ๊ฒƒ์€ ์•Œ์ง€๋งŒ ์—ฌ์ „ํžˆ ...)

@jbondc

ECMAScript์—๋Š” ์ •์  ๊ตฌ์กฐ ์œ ํ˜•์ด ์—†์œผ๋ฏ€๋กœ ํ•ด๋‹น ์ธ์ˆ˜๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ECMAScript์—์„œ ๋ชจ๋“  ๊ฐ’์€ any ์œ ํ˜•์ด๋ฏ€๋กœ ๋ฌด์—‡์ด๋“  ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ์‹ค์€ JS์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” TypeScript์˜ ์ •์  ์œ ํ˜• ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ์•”์‹œํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์•„์ด๋Ÿฌ๋‹ˆ๋ฅผ ์„ค๋ช…ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ์Šฌํ”„์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค. null
  2. ์ด ๊ฐ’์„ ๋ชจ๋“  ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ(์˜ˆ: ๋ฌธ์ž์—ด ์ˆซ์ž ๋˜๋Š” ๋ณต์žกํ•œ ๊ฐœ์ฒด var s:string = null )์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ•ด๋‹น ๊ฐ’์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜๋ฝํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” void ์œ ํ˜•์„ ๋งŒ๋“ค๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ T|void ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃผ์žฅ์€ (3)์€ ๋ง๋„ ์•ˆ๋˜๋Š” ๋ฐ˜๋ฉด (2)๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์•„์ด๋Ÿฌ๋‹ˆํ•œ ๋ถ€๋ถ„์ด ๋ณด์ด์‹œ๋‚˜์š”? ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์˜ˆ๋ฅผ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์ผ๋ถ€ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ๋งŒ ์ง€์›ํ•˜๋Š” ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค. {}
  2. ์ด ๊ฐ’์ด ํ›จ์”ฌ ๋” ๋งŽ์€ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ ์ง‘ํ•ฉ์„ ๊ฐ€์ง„ ๋ชจ๋“  ์œ ํ˜•์˜ ๋ณ€์ˆ˜(์˜ˆ: ๋ฌธ์ž์—ด ์ˆซ์ž ๋˜๋Š” ๋ณต์žกํ•œ ๊ฐœ์ฒด var s:string = {} )์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  3. {} ๊ฐ’์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜๋ฝํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ๋‚ด์žฅ๋œ ๊ฒƒ ์™ธ์—๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” {} ์œ ํ˜•์ด ์žˆ์œผ๋ฉฐ T|{} ๋‹น์—ฐํžˆ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. {}

์ด์ œ (2)์™€ (3) ์ค‘ ์–ด๋Š ๊ฒƒ์ด ๋„Œ์„ผ์Šค์ž…๋‹ˆ๊นŒ?

๋‘ ์˜ˆ์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ช‡ ๊ฐ€์ง€ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜• ์ •์˜ ์„ค๋ช…์— ๋ถˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋””์—์„œ๋‚˜ ๊ตฌํ˜„๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์•ฝ์† ์ด์™ธ์˜ ๊ฒƒ์€ ์ ˆ๋Œ€ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์ง€๋งŒ null์— ๋Œ€ํ•œ ์•ฝ์†์€ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ˆ์ „์€ ํ™•์‹คํžˆ ๋งค์šฐ ํ˜„์‹ค์ ์ž…๋‹ˆ๋‹ค.

@spion ๊ทธ๊ฒŒ ๋ฐ”๋กœ ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ด๊ฒƒ์ด ์กฐ๊ธˆ ์ •๋ฆฌ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์–‘ ์— ๋”ฐ๋ฅด๋ฉด:


๋ฌดํšจ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

void ํ‚ค์›Œ๋“œ๋กœ ์ฐธ์กฐ๋˜๋Š” Void ํƒ€์ž…์€ ๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฆฌํ„ด๊ฐ’์ด ์—†๋Š” ํ•จ์ˆ˜์˜ ๋ฆฌํ„ดํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

๋”ฐ๋ผ์„œ void๋Š” null|undefined๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

Void ์œ ํ˜•์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ๊ฐ’์€ null ๋ฐ undefined์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ null ๋ฐ undefined๋Š” void์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—).


Null์€ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

3.2.5 ๋„ ์œ ํ˜•
Null ์œ ํ˜•์€ ์œ ์‚ฌํ•œ ์ด๋ฆ„์˜ JavaScript ๊ธฐ๋ณธ ์œ ํ˜•์— ํ•ด๋‹นํ•˜๋ฉฐ null ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•œ.
null ๋ฆฌํ„ฐ๋Ÿด์€ Null ์œ ํ˜•์˜ ์œ ์ผํ•œ ๊ฐ’์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. Null ํ˜•์‹ ์ž์ฒด๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


์ •์˜๋˜์ง€ ์•Š์€ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

3.2.6 ์ •์˜๋˜์ง€ ์•Š์€ ์œ ํ˜•
์ •์˜๋˜์ง€ ์•Š์€ ์œ ํ˜•์€ ์œ ์‚ฌํ•œ ์ด๋ฆ„์˜ JavaScript ๊ธฐ๋ณธ ์œ ํ˜•์— ํ•ด๋‹นํ•˜๋ฉฐ ์ •์˜๋˜์ง€ ์•Š์€ ๋ฆฌํ„ฐ๋Ÿด์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.


Void๋Š” Null ๋ฐ Undefined _types_์˜ ์ƒ์œ„ ์œ ํ˜•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

. Void ์œ ํ˜•์€ Any ์œ ํ˜•์˜ ํ•˜์œ„ ์œ ํ˜•์ด๊ณ  Null ๋ฐ Undefined ์œ ํ˜•์˜ ์ƒ์œ„ ์œ ํ˜•์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Void๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.


๊ทธ๋ž˜์„œ @jbondc ๋Š” Typescript ์–ธ์–ด ์‚ฌ์–‘์— ๋”ฐ๋ผ null์€ ๊ฐ’, Null์€ ์œ ํ˜•, undefined๋Š” ๊ฐ’, Undefined๋Š” ์œ ํ˜•, Void(์ฝ”๋“œ์—์„œ ์†Œ๋ฌธ์ž)๋Š” Null์˜ ์ƒ์œ„ ์œ ํ˜•์ธ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ _์•”์‹œ์ ์œผ๋กœ ์บ์ŠคํŠธ_ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( any ์ œ์™ธ). ์‚ฌ์‹ค, Void๋Š” Null ๋ฐ Undefined ์œ ํ˜•๊ณผ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๋„๋ก ํŠน๋ณ„ํžˆ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌดํšจ์˜:

Void ์œ ํ˜•์€ Any ์œ ํ˜•์˜ ํ•˜์œ„ ์œ ํ˜•์ด๊ณ  Null ๋ฐ Undefined ์œ ํ˜•์˜ ์ƒ์œ„ ์œ ํ˜•์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Void๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

์—†๋Š”:

Null ์œ ํ˜•์€ ์ •์˜๋˜์ง€ ์•Š์€ ์œ ํ˜•์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์œ ํ˜•์˜ ํ•˜์œ„ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ฆ‰, null์€ Number ๋ฐ Boolean ๊ธฐ๋ณธ ์œ ํ˜•์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ๊ธฐ๋ณธ ์œ ํ˜•, ๊ฐ์ฒด ์œ ํ˜•, ๊ณต์šฉ์ฒด ์œ ํ˜• ๋ฐ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์œ ํšจํ•œ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์ฐพ์œผ์‹œ๋Š” ์ฃผ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค:

์ •์˜๋˜์ง€ ์•Š์€ ์œ ํ˜•์€ ๋ชจ๋“  ์œ ํ˜•์˜ ํ•˜์œ„ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด๋Š” undefined๊ฐ€ ๋ชจ๋“  ๊ธฐ๋ณธ ์œ ํ˜•, ๊ฐ์ฒด ์œ ํ˜•, ๊ณต์šฉ์ฒด ์œ ํ˜• ๋ฐ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์œ ํšจํ•œ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋” ๋ช…ํ™•ํ•ด ์กŒ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ null์— ๋Œ€ํ•œ ๋ณดํ˜ธ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ์œ ํ˜•๊ณผ undefined์— ๋Œ€ํ•œ ๋ณดํ˜ธ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†๋„๋ก null ๋˜๋Š” undefined๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ(๋„ˆ๋ฌด ์ค‘์š”ํ•œ ์ž‘์—…) ์ถ”๊ฐ€ ๋งˆํฌ์—…์„ ์„ ํƒํ•˜๋Š” ๊ธฐ๋Šฅ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์  ์žฅ, Null ๋˜๋Š” Undefined(์œ ํ˜•)๋ผ๊ณ  ๋ถ€๋ฅผ ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค.

@jbondc ์ด๊ฒƒ์€ ์•„์ด๋Ÿฌ๋‹ˆ์ž…๋‹ˆ๋‹ค. TS ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌด์—‡์„ ๋งํ•˜๋“  JS์˜ null ๋ฐ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์€ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ ์™ธ์—๋Š” ์–ด๋–ค ๋ฉ”์„œ๋“œ๋‚˜ ์†์„ฑ๋„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ, {} ๊ฐ’์„ ๋ฌธ์ž์—ด์— ํ• ๋‹นํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. TS์˜ void ์œ ํ˜•์—๋Š” ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. _ํ•˜์ง€๋งŒ_ null ๋˜๋Š” undefined ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ void ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ๋ง๋„ ์•ˆ๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ์•„์ด๋Ÿฌ๋‹ˆ์ž…๋‹ˆ๋‹ค. (์œ ํ˜• ๊ฐ€๋“œ์™€ ๊ณต์šฉ์ฒด๋ฅผ ํ†ตํ•ด) ๋‘˜ ๋‹ค ํ˜„์žฌ ์‹ค์ œ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. :)

TS ์ปดํŒŒ์ผ๋Ÿฌ๋งŒํผ ๋ณต์žกํ•œ ๊ฒƒ์ด ๊ฐ€๋“œ ์—†์ด ์ž‘์„ฑ๋˜์—ˆ๋‹ค๋Š” ์ ์€ ์ƒ๊ฐํ•ด ๋ณผ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

PHP ๋˜๋Š” JAVA๋กœ ์ž‘์„ฑ๋œ ๊ฝค ํฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ์œผ๋ฉฐ ์–ธ์–ด๋ฅผ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋” ๋‚˜์˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด์ง‘ํŠธ ํ”ผ๋ผ๋ฏธ๋“œ๋Š” ํ˜„๋Œ€ ๊ธฐ๊ณ„ ์—†์ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ 4500๋…„ ๋™์•ˆ ์šฐ๋ฆฌ๊ฐ€ ๋ฐœ๋ช…ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์“ฐ๋ ˆ๊ธฐ๋ผ๋Š” ๋œป์ž…๋‹ˆ๊นŒ?

@jbondc null ๋ฐ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’(๋ชฉ๋ก์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’ ๋นผ๊ธฐ)์œผ๋กœ ์ธํ•œ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ ์˜ ๋ฌธ์ œ ๋ชฉ๋ก ๊ณผ ํ•จ๊ป˜ ์œ„์˜ ๋‚ด ์„ค๋ช…์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@jbondc ์„ธ๊ณ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งˆ์Œ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๋„๊ตฌ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋“œ, ๊ณต์šฉ์ฒด ๋ฐ ์œ ํ˜• ๋ณ„์นญ๊ณผ ๋™์ผํ•œ ์˜ํ–ฅ๊ณผ ์œ ์šฉ์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ’์„ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์˜ตํŠธ์ธ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ ํ˜•์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ธ๊ธ‰๋œ ํฐ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” ๊ธฐ์กด TypeScript ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 1) nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ์ตœ์‹  ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ๋ฐ 2) ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์šด์šฉ - Python 2/3 ์Šคํƒ€์ผ์˜ ๋‚œ๊ด€ ๋ฐฉ์ง€

๊ธฐ์กด TS ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ๋นŒ๋“œํ•˜๋„๋ก ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ ์ด ์ œํ•œ๋œ ๊ฒฝ์šฐ์—๋Š” Python์—์„œ 2to3๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋„(null) ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด '?T' ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ง€์›์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ์ด๊ฒƒ์€ ์œ ํ˜• ๊ฒ€์‚ฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉฐ ๋ฌธ์„œํ™”๋ฅผ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  2. '?T'๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋ฉ์ฒญํ•œ ๊ตฌํ˜„์€ 'T'์˜ ๋ชจ๋“  ์‚ฌ์šฉ์„ '?T'๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋˜‘๋˜‘ํ•œ ๊ตฌํ˜„์€ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์•”์‹œ์ ์œผ๋กœ null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•˜๊ณ  ์ด ๊ฒฝ์šฐ 'T'๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. '?T' ์œ ํ˜•์˜ ๊ฐ’์„ 'T'๋ฅผ ์˜ˆ์ƒํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” ์†์„ฑ์— ํ• ๋‹นํ•˜๋ ค๋Š” ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, ์ด๋Š” ๊ฐ’์ด null์ด ์•„๋‹ˆ๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ์ž๋ฆฌ ํ‘œ์‹œ์ž๋กœ ๊ฐ’์„ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: let foo: T = expect(possiblyNullFoo) ๋˜๋Š” let foo:T = possiblyNullFoo!
  3. ์ œ๊ณต๋œ ๋ชจ๋“  ์œ ํ˜• ์ •์˜์™€ ํ™•์‹คํžˆ ์œ ํ˜•์ด ์ง€์ •๋œ ์ €์žฅ์†Œ์— ์žˆ๋Š” ์œ ํ˜• ์ •์˜์— ๋„๊ตฌ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  4. 'T'๋ฅผ ์˜ˆ์ƒํ•˜๋Š” ์Šฌ๋กฏ์— '?T'๋ฅผ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ฒฝ๊ณ ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ณ  ์ด์‹์ด ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ˆ˜์‹ ๋˜๋Š” ๋ฐฉ์‹์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  6. ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ฃผ์š” ์ƒˆ ๋ฆด๋ฆฌ์Šค์—์„œ 'T' ์˜ค๋ฅ˜๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ์Šฌ๋กฏ์— '?T'๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋„๊ตฌ๊ฐ€ ์•„์ง ์ ์šฉ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์˜ ์‚ฌ์šฉ์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋„์ž…ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ์˜๊ฒฌ์—์„œ ์–ธ์–ด ๋ถ„ํ• ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ 'T'์˜ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•˜๋Š” ๋ชจ๋“œ๊ฐ€ ์—†์œผ๋ฉฐ 6๋‹จ๊ณ„๊ฐ€ ์‹ค์šฉ์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ 1-3๋‹จ๊ณ„ ์ž์ฒด๊ฐ€ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ž„์˜์˜ ์ƒ๊ฐ:

  1. expect() ๋ถ€๋ถ„์€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž˜ ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ• ๋‹น๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค, ์ œ๋„ค๋ฆญ ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•...
  2. ๋‚˜๋Š” _์ƒ๊ฐ__ TS์—๋Š” ๊ฒฝ๊ณ ๊ฐ€ ์—†๊ณ  ์˜ค๋ฅ˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์˜ณ๋‹ค๋ฉด ๊ทธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ• ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  3. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ฝ”๋“œ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋”๋ผ๋„ ๊ธฐ์—…์€ ์—…๊ทธ๋ ˆ์ด๋“œ ์†๋„๊ฐ€ ๋งค์šฐ ๋Š๋ฆฌ๊ฑฐ๋‚˜ ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ํฐ ๊ฒฝ์šฐ์—๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํ•ด๋‹น ์ฃผ์š” ๋ฆด๋ฆฌ์Šค๋Š” TS ํŒ€์ด ์›ํ•˜์ง€ ์•Š๋Š” ์—„์ฒญ๋‚œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์—ฌ์ „ํžˆ null ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๋Š” "์„ ํƒ" ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊บผ์ ธ ์žˆ์„ ๋•Œ ๋™์ผํ•œ ์ฝ”๋“œ/์ •์˜๊ฐ€ ๋™์ผํ•œ ๋™์ž‘(์˜ค๋ฅ˜ ์ œ์™ธ)์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์•„์ง ์ƒ๊ฐํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@jods4 - expect() ๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ?T ๊ฐ€ ์žˆ๋Š” ๊ณณ๋งˆ๋‹ค ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ T | undefined ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ทœ์น™์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ.

TypeScript์—์„œ '๊นƒ๋ฐœ์˜ ๋‚ '์ด ์–ผ๋งˆ๋‚˜ ํ˜„์‹ค์ ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. '์˜ตํŠธ์ธ' ํ”Œ๋ž˜๊ทธ ์™ธ์—๋„ ๊ฒฐ๊ตญ ์˜ตํŠธ์•„์›ƒ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋˜๋Š” ์˜ตํŠธ์ธ ํ”Œ๋ž˜๊ทธ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€์šฉ๊ตฌ ์Šคํƒ€์ผ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๋ฐฉํ–ฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ† ๋ก ๊ณผ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๊ฒƒ - https://github.com/rwaldron/tc39-notes/blob/master/es6/2015-01/JSExperimentalDirections.pdf ์œ ํ˜• ์ •๋ณด(TypeScript ์Šคํƒ€์ผ์„ ํ†ตํ•ด ์ง€์ •๋จ) ์‚ฌ์šฉ์— ๋Œ€ํ•œ Chrome ํŒ€์˜ ์กฐ์‚ฌ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„)์„ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์‚ฌ์šฉํ•˜์—ฌ JS๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. null ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ์—ด๋ฆฐ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ์›ํ•˜์ง€๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด์„œ๋„ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋‹ค์‹œ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋ถ€๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ.
null ๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ๊ฐ’์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์‹œ๊ฐ„๊ณผ ์ฝ”๋”ฉ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์„ 'nullable์ด ์•„๋‹˜'์œผ๋กœ ์„ค๋ช…ํ•˜๋ฉด null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•˜๊ณ  null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ฝ”๋“œ ๊ณ„์•ฝ ๊ตฌํ˜„์œผ๋กœ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

null ๋ฆฌํ„ฐ๋Ÿด ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๊ณ  ๋ชจ๋“  ์žฅ์†Œ๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
null์ด ์ฝ”๋“œ์— ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒํ•˜๋ฉด null๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ณณ์—์„œ null ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š” ์—†์ด ์ฐธ์กฐ ์˜ˆ์™ธ.
2015๋…„ 2์›” 20์ผ ์˜คํ›„ 1์‹œ 41๋ถ„์— "electricessence" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋‹ค์‹œ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž๋‹ค
์ด ํ•˜๋‚˜.

์—ฌ๊ธฐ์— ๋ถ€๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์‹œ์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ
์‹œ๊ฐ.
๊ฐ’์„ null ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ’์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์‹œ๊ฐ„๊ณผ ์ฝ”๋”ฉ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…ํ•˜์ž๋ฉด
'nullable์ด ์•„๋‹˜'์œผ๋กœ ์œ ํ˜•์„ ์ž…๋ ฅํ•˜๋ฉด ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด ์–ด์„ค์…˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์ƒ๋˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ
null์ด ์•„๋‹™๋‹ˆ๋‹ค.

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ฝ”๋“œ ๊ณ„์•ฝ์œผ๋กœ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌํ˜„.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -75295204
.

Null ๊ฒ€์‚ฌ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒ€์‚ฌ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.
2015๋…„ 2์›” 21์ผ ์˜ค์ „ 11์‹œ 54๋ถ„์— "Aleksey Bykov" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

null ๋ฆฌํ„ฐ๋Ÿด ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๊ณ  ๋ชจ๋“  ์žฅ์†Œ๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
null์ด ์ฝ”๋“œ์— ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒํ•˜๋ฉด null๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ณณ์—์„œ null ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š” ์—†์ด ์ฐธ์กฐ ์˜ˆ์™ธ.
2015๋…„ 2์›” 20์ผ ์˜คํ›„ 1์‹œ 41๋ถ„ "electricessence" ์•Œ๋ฆผ @github.com
์ผ๋‹ค:

์—ฌ๊ธฐ์—์„œ ๋‹ค์‹œ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž๋‹ค
์ด ํ•˜๋‚˜.

์—ฌ๊ธฐ์— ๋ถ€๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์‹œ์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ
์‹œ๊ฐ.
๊ฐ’์„ null ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ’์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์‹œ๊ฐ„๊ณผ ์ฝ”๋”ฉ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…ํ•˜์ž๋ฉด
'non-nullable'๋กœ ์ž…๋ ฅํ•˜๋ฉด ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด
์ฃผ์žฅ
์˜ˆ์ƒ๋˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ
null์ด ์•„๋‹™๋‹ˆ๋‹ค.

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ฝ”๋“œ ๊ณ„์•ฝ์œผ๋กœ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌํ˜„.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
<
https://github.com/Microsoft/TypeScript/issues/185#issuecomment-75295204>
.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -75346198
.

๋‚ด ์š”์ ์€ ์ด๋Ÿฌํ•œ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(null ํ‚ค์›Œ๋“œ๊ฐ€ ๊ธˆ์ง€๋œ ๊ฒฝ์šฐ
๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์žฅ์†Œ๋Š” ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค).

์™œ์š”? 1. ๊ฒ€์‚ฌ๊ฐ€ ์ „ํ˜€ ์—†๋Š” ์ฝ”๋“œ๋Š” ์ฝ”๋“œ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
null ๊ฒ€์‚ฌ์™€ ํ•จ๊ป˜. 2. if๊ฐ€ ์ ๊ฒŒ ํฌํ•จ๋˜์–ด ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
์œ ์ง€ ๋ณด์ˆ˜ ๊ฐ€๋Šฅ.
2015๋…„ 2์›” 20์ผ ์˜คํ›„ 7์‹œ 57๋ถ„์— "Griffork" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Null ๊ฒ€์‚ฌ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒ€์‚ฌ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.
2015๋…„ 2์›” 21์ผ ์˜ค์ „ 11์‹œ 54๋ถ„์— "Aleksey Bykov" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

null ๋ฆฌํ„ฐ๋Ÿด ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๊ณ  ๋ชจ๋“  ์žฅ์†Œ๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
null์ด ์ฝ”๋“œ์— ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒํ•˜๋ฉด null๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ณณ์—์„œ null ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š” ์—†์ด ์ฐธ์กฐ ์˜ˆ์™ธ.
2015๋…„ 2์›” 20์ผ ์˜คํ›„ 1์‹œ 41๋ถ„ "electricessence" ์•Œ๋ฆผ @github.com
์ผ๋‹ค:

์—ฌ๊ธฐ์—์„œ ๋‹ค์‹œ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž๋‹ค
์ด ํ•˜๋‚˜.

์—ฌ๊ธฐ์— ๋ถ€๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์‹œ์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ
์‹œ๊ฐ.
null ๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹ 
์—๊ฒŒ
๊ฐ’์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์‹œ๊ฐ„๊ณผ ์ฝ”๋”ฉ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‚ด๊ฐ€
์„ค๋ช…ํ•˜๋‹ค
'non-nullable'๋กœ ์ž…๋ ฅํ•˜๋ฉด ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด
์ฃผ์žฅ
์˜ˆ์ƒ๋˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ
null์ด ์•„๋‹™๋‹ˆ๋‹ค.

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ฝ”๋“œ ๊ณ„์•ฝ์œผ๋กœ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌํ˜„.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
<
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -75295204

.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
<
https://github.com/Microsoft/TypeScript/issues/185#issuecomment-75346198>
.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -75346390
.

์š”์ ์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒ€์‚ฌ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด null์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•˜๋‚˜์˜ ์ผ๊ด€๋œ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—,
์ข…์ข… ๊ฐ์ฒด ๋Œ€์‹  null/undefined๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
2015๋…„ 2์›” 21์ผ ์˜คํ›„ 12์‹œ 20๋ถ„์— "Aleksey Bykov" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋‚ด ์š”์ ์€ ์ด๋Ÿฌํ•œ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(null ํ‚ค์›Œ๋“œ๊ฐ€ ๊ธˆ์ง€๋œ ๊ฒฝ์šฐ
๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์žฅ์†Œ๋Š” ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค).

์™œ์š”? 1. ๊ฒ€์‚ฌ๊ฐ€ ์ „ํ˜€ ์—†๋Š” ์ฝ”๋“œ๋Š” ์ฝ”๋“œ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
null ๊ฒ€์‚ฌ์™€ ํ•จ๊ป˜. 2. if๊ฐ€ ์ ๊ฒŒ ํฌํ•จ๋˜์–ด ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
์œ ์ง€ ๋ณด์ˆ˜ ๊ฐ€๋Šฅ.
2015๋…„ 2์›” 20์ผ ์˜คํ›„ 7์‹œ 57๋ถ„์— "Griffork" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Null ๊ฒ€์‚ฌ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒ€์‚ฌ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.
2015๋…„ 2์›” 21์ผ ์˜ค์ „ 11์‹œ 54๋ถ„, "Aleksey Bykov" ์•Œ๋ฆผ @github.com
์ผ๋‹ค:

null ๋ฆฌํ„ฐ๋Ÿด ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๊ณ  ๋ชจ๋“  ์žฅ์†Œ๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์–ด๋””
null์ด ์ฝ”๋“œ์— ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒํ•˜๋ฉด null๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ณณ์—์„œ null ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š” ์—†์ด ์ฐธ์กฐ ์˜ˆ์™ธ.
2015๋…„ 2์›” 20์ผ ์˜คํ›„ 1์‹œ 41๋ถ„ "electricessence" ์•Œ๋ฆผ @github.com
์ผ๋‹ค:

์—ฌ๊ธฐ์—์„œ ๋‹ค์‹œ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž๋‹ค
ํ•ด๊ฒฐ
์ด ํ•˜๋‚˜.

์—ฌ๊ธฐ์— ๋ถ€๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์—์„œ๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ
์—ฎ๋‹ค
์‹œ๊ฐ.
null ๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹ 
ํ•  ์ˆ˜์žˆ๋Š”
์—๊ฒŒ
๊ฐ’์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์‹œ๊ฐ„๊ณผ ์ฝ”๋”ฉ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‚ด๊ฐ€
์„ค๋ช…ํ•˜๋‹ค
'non-nullable'๋กœ ์ž…๋ ฅํ•˜๋ฉด ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด
์ฃผ์žฅ
์˜ˆ์ƒ๋˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ
null์ด ์•„๋‹™๋‹ˆ๋‹ค.

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ณ„์•ฝ
๊ตฌํ˜„.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
<

https://github.com/Microsoft/TypeScript/issues/185#issuecomment -75295204

.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
<
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -75346198

.

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
<
https://github.com/Microsoft/TypeScript/issues/185#issuecomment-75346390>
.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -75347832
.

๋‹น์‹ ๋„ ๋‚ด ํฌ์ธํŠธ๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋„๋ก null ๋˜๋Š” undefined๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด์ œ ํ†ตํ•ฉ ์œ ํ˜• ์ง€์›์ด ๊ณ ๋ ค๋˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

class Nothing { public 'i am nothing': Nothing; }
class Something { 
    constructor(
    public name: string,
    public value: number
   ) { }
}
var nothing = new Nothing();
var whoami = Math.random() > 0.5 ? new Something('meh', 66) : nothing;

if (whoami instanceof Nothing) {
    console.log('i am a null killer');
} else if (whoami instanceof Something) {
    console.log(whoami.name + ': ' + whoami.value);
}

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” null ๋˜๋Š” undefined๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ์ธ์ฝ”๋”ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์šฐ๋ฆฌ๋Š” 100% ๋ช…์‹œ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ๊ฐ€๋“œ ๋•๋ถ„์— ๊ฐ’์„ ์ฝ๊ธฐ ์ „์— ์ฒดํฌ๋ฅผ ๋†“์น  ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ๋ฉ‹์ง„๊ฐ€์š”?

๊ฒ€์‚ฌ ์ธ์Šคํ„ด์Šค๊ฐ€ null ๊ฒ€์‚ฌ๋ณด๋‹ค ๋น ๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?
์ดˆ๋‹น ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜?
๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋ณ„์นญ์„ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
'.'๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ์ ‘๊ทผ์ž.
2015๋…„ 2์›” 21์ผ ์˜คํ›„ 12์‹œ 58๋ถ„์— "Aleksey Bykov" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ๋„ ๋‚ด ํฌ์ธํŠธ๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ 
null์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ฑฐ๋‚˜
์ฐพ์œผ์‹œ๋Š” ์ฃผ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด์ œ Union ์œ ํ˜•์ด ์ง€์›๋˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ณ ๋ คํ•˜๋‹ค:

class Nothing { public '๋‚˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค': ์•„๋ฌด๊ฒƒ๋„; }
ํด๋ž˜์Šค ๋ญ”๊ฐ€ {
๊ฑด์„ค์ž(
๊ณต๊ฐœ ์ด๋ฆ„: ๋ฌธ์ž์—ด,
๊ณต๊ฐœ ๊ฐ€์น˜: ์ˆซ์ž
) { }
}
var ์•„๋ฌด๊ฒƒ๋„ = ์ƒˆ๋กœ์šด ์•„๋ฌด๊ฒƒ๋„();
var whoami = Math.random() > 0.5 ? ์ƒˆ๋กœ์šด ๋ฌด์–ธ๊ฐ€('meh', 66) : ์•„๋ฌด๊ฒƒ๋„;

if (whoami instanceof ์•„๋ฌด๊ฒƒ๋„) {
// whoami๋Š” ์•„๋ฌด๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค
console.log('๋‚˜๋Š” ๋„ ํ‚ฌ๋Ÿฌ๋‹ค');
} else if (whoami instanceof Something) {
// whoami๋Š” Something์˜ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค.
console.log(whoami.name + ': ' + whoami.value);
}

๊ทธ๋ž˜์„œ null ๋˜๋Š” undefined๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ์ธ์ฝ”๋”ฉํ–ˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์šฐ๋ฆฌ๋Š” _100% ๋ช…์‹œ์ ์ธ ๋ฐฉ์‹_์œผ๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
๊ฒฝ๋น„์›, ๊ฐ’์„ ์ฝ๊ธฐ ์ „์— ๊ฒ€์‚ฌ๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ๋ฉ‹์ง„๊ฐ€์š”?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -75349967
.

@aleksey-bykov ์ด๋ฏธ ๊ทธ ์ ์„ ์–ธ๊ธ‰ํ–ˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ด๋ฏธ null ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์œ ํ˜• ์ •์˜๋ฅผ ๋ชจ๋ธ๋งํ•ด์•ผ ํ•˜๋Š” ํ•„์š”์„ฑ์€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ null ๊ฐ’์„ "์‚ฌ์šฉ ์ค‘์ง€"ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ undefined ๊ฐ€ ๋  ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ๋ฌธ์ œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Haskell์—์„œ๋Š” ๊ฐ’์„ "์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€" ์ƒํƒœ๋กœ ๋‘˜ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

@Griffork , ๋‚˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์— ๋”ฐ๋ฅด๋ฉด ๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
http://jsperf.com/nullable-vs-null-vs-undefined-vs-instanceof
๊ทธ๋ž˜๋„ ์•ˆ์ „๊ณผ ์„ฑ๋Šฅ ์‚ฌ์ด์—์„œ ๊ท ํ˜•์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ์„ฑ๋Šฅ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์ธก์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์žฅ๋‚˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ์šฐ๋ คํ•˜๋Š” null ๊ฒ€์‚ฌ๊ฐ€ ์ „์ฒด ์„ฑ๋Šฅ์˜ 2% ๋ฏธ๋งŒ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‘ ๋ฐฐ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๋ฉด 1%๋งŒ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@spion , ํ˜„์žฌ ์ƒํ™ฉ๊ณผ non-nullable์ด ๊ฐ€์ ธ์˜ค๋Š” ๋ฌธ์ œ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ์ฝ”๋“œ์—์„œ null์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ

์šฐ๋ฆฌ์˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค๋Š” 800๊ฐœ๊ฐ€ ๋„˜๋Š” TypeScript ํŒŒ์ผ๊ณผ 120,000์ค„ ์ด์ƒ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ๋ง๊ณผ ๊ด€๋ จํ•˜์—ฌ null ๋˜๋Š” undefined๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๋„๋ฉ”์ธ ์—”ํ„ฐํ‹ฐ. ๊ทธ๋ฆฌ๊ณ  DOM ์กฐ์ž‘์„ ์œ„ํ•ด null์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์ง€๋งŒ,
์ด๋Ÿฌํ•œ ๋ชจ๋“  ์žฅ์†Œ๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ๊ฒฉ๋ฆฌ๋˜์–ด null์ด ๋ˆ„์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” null์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹น์‹ ์˜ ์ฃผ์žฅ์„ ๋ฏฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
null์ด ์ „ํ˜€ ์—†๋Š”(Haskell) ๋˜๋Š” null์ด ์žˆ๋Š” ํ”„๋กœ๋•์…˜ ์ค€๋น„ ์–ธ์–ด
๊ธˆ์ง€๋จ(F#).
2015๋…„ 2์›” 22์ผ ์˜ค์ „ 9์‹œ 31๋ถ„์— "Jon" [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@aleksey-bykov https://github.com/aleksey-bykov ์‹ค์šฉ์ ์ธ
๊ด€์ ์—์„œ null์„ ๋ฌด์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ท€ํ•˜๊ฐ€
์–ด์จŒ๋“  nullable ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
https://www.google.com/patents/US7627594?ei=P4XoVPCaEIzjsATm4YGoBQ&ved=0CFsQ6AEwCTge

์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -75437927
.

๋„ค, ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ์—”ํ„ฐํ‹ฐ๋ฅผ ๋ชจ๋ธ๋งํ•˜์ง€ ์•Š๊ณ  ์‹œ๊ฐ„์— ๋งค์šฐ ๋ฏผ๊ฐํ•˜๋ฉฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๊ท€ํ•˜๋ณด๋‹ค ๋„ˆ๋ฌด ์ž‘์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชฉ์ ์„ ์œ„ํ•ด null์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. Null ์—†์ด Typescript๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด์„œ๋Š” null์ด ํ•„์š”ํ•˜๊ณ , ๊ทธ๋Ÿด ์—ฌ์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์•„, ๋ฐฉ๊ธˆ ๋‹ค๋ฅธ ๋Œ“๊ธ€์„ ๋ดค์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.
์ด ์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์„ ์ฝ์œผ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ํ•ญ์ƒ null์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ์ฝ”๋“œ ๋น„ํŠธ์— ์Šค๋ฉฐ๋“œ๋Š” ๋ฌธ์ œ๊ฐ€ ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  (๋ณธ์งˆ์ ์œผ๋กœ) ๋งํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ๋„ ์ฝ์—ˆ๋‹ค๋ฉด nullable์ด ์•„๋‹Œ ์ œ์•ˆ์€ undefined๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์†๋„์— ๋Œ€ํ•œ ๋ณ€์ˆ˜์—์„œ null๊ณผ undefined๋Š” ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ๊ฐœ์ฒด(ํŠนํžˆ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด ์žˆ๋Š” ๊ฐœ์ฒด)์— ํ‘œ์‹œ๋˜๋Š” ์ฆ‰์‹œ ์ด์•ผ๊ธฐ๊ฐ€ ๋งค์šฐ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์‹  null์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ (์ €ํฌ์ฒ˜๋Ÿผ) <10ms ๋™์•ˆ 10,000๋ฒˆ์˜ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฑฑ์ •ํ•  ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

(๊ทธ๋ฆฌ๊ณ  ์˜ˆ, ์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ถ”์ ํ•˜๊ณ  ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ฐพ์•„ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค)

์ด์— ๋Œ€ํ•œ ๋…ผ์˜์— ๋ฐ•์ฐจ๋ฅผ ๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์–ด์ œ ๋นŒ๋“œ ๋น„๋””์˜ค ์—์„œ C#์œผ๋กœ ๊ตฌํ˜„๋œ ๋ถ„์„๊ธฐ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. TypeScript์™€ ์œ ์‚ฌํ•œ ๊ตฌํ˜„์„ ์œ„ํ•ด ์ด์Šˆ #3003์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถ„์„๊ธฐ๋Š” ์ถ”๊ฐ€ ๊ตฌ๋ฌธ ๊ฒ€์‚ฌ, ์˜ค๋ฅ˜/๊ฒฝ๊ณ ๋กœ ํƒœ๊ทธ ๋ผ์ธ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ์–ธ์–ด ์„œ๋น„์Šค์—์„œ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ null ๊ฒ€์‚ฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‹œํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค TypeScript์˜ ๋ถ„์„๊ธฐ๋Š” ๋‹ค๋ฅธ ์šฉ๋„๋กœ๋„ ์ •๋ง ํ›Œ๋ฅญํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—๋Š” C#๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ด์ƒํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•ด: ์ €๋Š” ๋ณ€์ˆ˜์˜ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” monapt ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” Typescript ์ •์˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ๊ฒƒ์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

๋ฐฉ๊ธˆ ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

TS ์‚ฌ์–‘์˜ void ๊ฐ€ null ๋ฐ undefined ๊ฐ’์— ๋Œ€ํ•œ ์œ ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ์•ˆ์„œ๋Š” non-voidable ๋ฐ voidable ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค void . (์ œ์•ˆ์€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’๋„ ํฌํ•จํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค :smile: )

๋‚˜๋Š” ๋˜ํ•œ ์ •์˜๋˜์ง€ ์•Š์€ ์•ก์„ธ์Šค ๋˜๋Š” null ์˜ˆ์™ธ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ชจ๋“  ์•…์˜ ๊ทผ์›์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์˜ ์ˆ˜๋งŽ์€ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”! ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ๊ธฐ๋Šฅ์ด ๋œ๋‹ค๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋งŽ์€ ๋””๋ฒ„๊น… ์ง€์˜ฅ์„ ์ ˆ์•ฝํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ADT๋ฅผ nullable ํ˜•์‹ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—๋Š” ๋™์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ „๋‹ฌํ•˜๋Š” ADT๊ฐ€ null์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ADT๋ฅผ ํฌํ•จํ•˜์—ฌ TS์˜ ๋ชจ๋“  ์œ ํ˜•์€ null์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์ด ADT๋ฅผ nullable์ด ์•„๋‹Œ(non-voidable) ์œ ํ˜•์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๋ฐ ์žˆ์–ด ์ฃผ์š” ๊ฒฐํ•จ์ด๋ผ๊ณ  ๋ด…๋‹ˆ๋‹ค. ADT๋Š” nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ํ—ˆ์šฉ(๋˜๋Š” ๊ธˆ์ง€)ํ•˜๋Š” ์–ธ์–ด์—์„œ๋งŒ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ๋ฌธ์ œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์„ ์ธ์ˆ˜๋กœ ์˜ˆ์ƒํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ TS ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•จ์ˆ˜์— null ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒ€์‚ฌ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์˜ณ์ง€ ์•Š๋‹ค...

ADT๋ฅผ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๋ฐ ํฐ ๊ฒฐํ•จ์ด ์žˆ๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค...

  1. ๋””์ž์ธ ํŒจํ„ด์„ ํ†ตํ•ด ADT๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋„ค์ดํ‹ฐ๋ธŒ
    TypeScript์—์„œ ์ง€์›)
  2. null ํ‚ค์›Œ๋“œ ๊ธˆ์ง€
  3. null์ด ์™ธ๋ถ€์—์„œ ์ฝ”๋“œ๋กœ ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์žฅ์†Œ๋ฅผ ๋ณดํ˜ธํ•˜์‹ญ์‹œ์˜ค.
  4. null ๋ฌธ์ œ๊ฐ€ ์˜์›ํžˆ ์‚ฌ๋ผ์ง์„ ์ฆ๊ธฐ์‹ญ์‹œ์˜ค

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” 1, 2, 3๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋งž์ถฐ๋ณด์„ธ์š”
์ง€๊ธˆ.

@aleksey-bykov

undefined (2) ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? undefined ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํด๋ž˜์Šค ๋ฉค๋ฒ„, ์„ ํƒ์  ํ•„๋“œ, ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ์˜ ๋ฐ˜ํ™˜ ๋ฌธ ๋ˆ„๋ฝ...

typescript ์™€ flowtype์„ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ์ ์–ด๋„ ํ๋ฆ„์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๋˜ํ•œ "๊ทธ ์–ธ์–ด์˜ ์ผ๋ฐ˜์ ์ธ ๊ด€์šฉ๊ตฌ๋Š” ์žŠ์–ด๋ฒ„๋ฆฌ์„ธ์š”. ์ƒ๊ด€์—†์–ด์š”. ๋‚˜๋จธ์ง€ ์„ธ๊ณ„์™€ ์ œ ์ž์‹ ์„ ๊ฒฉ๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋งˆ๋„

์ •์˜๋˜์ง€ ์•Š์€ ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํด๋ž˜์Šค ๋ฉค๋ฒ„ - ๊ธˆ์ง€๋œ ํด๋ž˜์Šค
  • ์„ ํƒ์  ํ•„๋“œ - ์„ ํƒ์  ํ•„๋“œ/๋งค๊ฐœ๋ณ€์ˆ˜ ๊ธˆ์ง€
  • ๋ˆ„๋ฝ๋œ return ๋ฌธ - ๋ชจ๋“  ์‹คํ–‰ ๊ฒฝ๋กœ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋„๋ก ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • tslint ๊ทœ์น™

์ˆœ์ˆ˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค

  • ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์›ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋Š” ์„ฑ๋Šฅ๊ณผ ๊ฐ€์žฅ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@aleksey-bykov null ํ—ˆ์šฉ ์œ ํ˜•์„ ADT๋กœ ๊ต์ฒดํ•˜๋ฉด ํ๋ฆ„ ์œ ํ˜•๊ณผ ๊ฐ™์€ null ๊ฒ€์‚ฌ๋ฅผ ์‹œํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ ์ƒ๋‹นํ•œ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ถ€๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์„ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค(๋งŽ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋œ ๋งŽ์€ ๊ฐœ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ๊ฒฝ์šฐ ์—„์ฒญ๋‚˜๊ฒŒ ๋น„์Œ€ ์ˆ˜ ์žˆ์Œ)

์„ ํƒ์  ํ•„๋“œ๋ฅผ ํฌ๊ธฐํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ๋„ˆ๋ฌด ๋งŽ์€ JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋„์„œ๊ด€๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ–ˆ๋Š”๊ฐ€?

๋‹น์‹ ์€ ๋˜ํ•œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ํด๋ž˜์Šค(์˜ˆ: React)์— ์˜์กดํ•˜๋Š”(๋˜๋Š” ์˜์กดํ• ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”ผํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ฉ๋ฆฌ์ ์ธ ์†”๋ฃจ์…˜(์‹ค์ œ๋กœ ๊ธฐ๋ณธ ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์–ธ์–ด์— ๋งž๋Š”)์ด ๊ตฌํ˜„๋  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’์ง€๋งŒ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํฌ๊ธฐํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ADT์˜ ์œ ์ผํ•œ ๋ชฉ์ ์ด ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null๋กœ ์ธ์ฝ”๋”ฉ๋˜์—ˆ์„ ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐจ๋ผ๋ฆฌ "null" ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ(ํด๋ž˜์Šค๋„ ํฌํ•จ)์ด ADT๊ฐ€ ์šฐ๋ฆฌ์—๊ฒŒ ๊ฐ€์ ธ๋‹ค์ฃผ๋Š” ๋ชจ๋“  ์ข‹์€ ๊ฒƒ๋“ค์˜ ๋ถ€์‚ฐ๋ฌผ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ํ˜ธ๊ธฐ์‹ฌ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ํƒ€์ดํŠธํ•œ ๋ฃจํ”„ ๋ฐ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๊ฐ™์€ ์„ฑ๋Šฅ์— ์ค‘์š”ํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด TypeScript๊ฐ€ ๋ž˜ํ•‘๋œ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋„๋ก ์†์—ฌ์„œ Nullable<a> ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ (๋Ÿฐํƒ€์ž„์—) ๊ทธ๋Ÿฌํ•œ ๊ฐ’์€ ๋‹จ์ง€ null์„ ํ—ˆ์šฉํ•˜๋Š” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์—๋Š” null์ด ๋ˆ„์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” Nullable์— ๋Œ€ํ•œ ํŠน์ˆ˜ ์ž‘์—… ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”

interface Nullable<a> {
    'a nullable': Nullable<a>;
    'uses a': a;
}
/*  the following `toNullable` function is just for illustration, we don't use it in our code,
    because there are no values capable of holding naked null roaming around,
    instead we just alter the definition of all unsafe external interfaces:
    // before
    interface Array<T> {
       find(callback: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T;
    }
    // after
    interface Array<a> {
       find(callback: (value: a, index: number, array: a[]) => boolean, thisArg: any): Nullable<a>;
    }
*/
function toNullable<a>(value: a) : Nullable<a> {
    return <any>value;
}
function toValueOrDefault<a>(value: Nullable<a>, defaultValue: a)  : a {
    return value != null ? <any>value : defaultValue;
}

์žฌ๊ท€ ์œ ํ˜• ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? 'a nullable': a ์ด๋ฉด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ์™ธ๋ถ€ ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด callFunctionWithNullableResult<T,U>(f: (T) => U, arg:T):Nullable<U> (arity๊ฐ€ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์˜ค๋ฒ„๋กœ๋“œ ํฌํ•จ)๋„ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  null ํ‚ค์›Œ๋“œ๊ฐ€ linter์— ์˜ํ•ด ๊ธˆ์ง€๋œ ๊ฒฝ์šฐ nullable์— " Nothing "๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ toNullable(null) ์ž…๋‹ˆ๊นŒ?

๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ์••๋‹ˆ๋‹ค. ADT(๋˜๋Š” ์˜คํžˆ๋ ค ํ•ฉ๊ณ„ ์œ ํ˜•) + ํŒจํ„ด ์ผ์น˜๊ฐ€ typescript์˜ ๊ณต์šฉ์ฒด + ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜• ๊ฐ€๋“œ๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” ์ผ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค(์™„๋ฒฝํ•œ ๊ฒ€์‚ฌ ๋ฐ ํˆฌ๋ฐ•ํ•จ ์ œ์™ธ)๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์žฌ๊ท€ ์œ ํ˜• ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? 'nullable': ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ์ด ์˜ˆ์—์„œ๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 2๊ฐ€์ง€ ๋ณ„๊ฐœ์˜ ๊ฒฝ์šฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ทธ๋Ÿฌํ•œ ํ•„๋“œ์˜ ๋ชฉ์ ์„ ์˜ค๋ฒ„๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

  • ์œ ํ˜•์„ ๋ช…๋ชฉ์œผ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด(๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ํŒŒ์ผ ์ด๋ฆ„): https://gist.github.com/aleksey-bykov/0ab85f0b5e83fc848f85
  • ์ผ๋ฐ˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ธ์‹ํ•˜๋„๋ก ํ•˜์—ฌ ๊ฐœ์ฒด์˜ ํ‘œ๋ฉด๊นŒ์ง€ ๊ณ ๋ ค๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค(๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ๊ฐ’ ์œ ํ˜•): https://github.com/Microsoft/TypeScript/issues/468

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๊ฐ๊ฐ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” 2๊ฐœ์˜ ๊ฐœ๋ณ„ ์˜์‚ฌ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

callFunctionWithNullableResult๋„ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.(f: T -> U, arg:T) => ๋„ ์ž…๋ ฅ ๊ฐ€๋Šฅ

์•„๋‹ˆ์š”, ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์šฐ๋ฆฌ๋Š” ์™ธ๋ถ€ ์ฝ”๋“œ์—์„œ null์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ฆ๊ฑฐ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ Nullable "wrapper"๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์ •์˜(*.d.ts) ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„์˜ ์˜ˆ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋‚ด ์ด์ „ ๋ฉ”์‹œ์ง€์—์„œ

nullable์— "์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ์•Š์Œ"์„ ์–ด๋–ป๊ฒŒ ์–ป์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” nullable์— null์„ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. nullable์€ ์„œ๋ฒ„(์šฐ๋ฆฌ๊ฐ€ ์ œํ•œ์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ) ๋˜๋Š” ์™ธ๋ถ€ API์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ฝ”๋“œ์— ์žˆ๋Š” ์ฆ‰์‹œ Nullable๋กœ ๋ž˜ํ•‘๋˜์ง€๋งŒ ์šฐ๋ฆฌ ์ฝ”๋“œ๋Š” ๋‹ค์Œ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž„์˜์˜ nullable์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ฃผ์–ด์ง„ nullable์„ ๋‹ค๋ฅธ nullable๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜๋งŒ ์žˆ์ง€๋งŒ ํ—ˆ๊ณต์—์„œ ์ƒ์„ฑํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

typescript์˜ ๊ณต์šฉ์ฒด + ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜• ๊ฐ€๋“œ๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์•„! ๋‚˜๋Š” ๋…ธ์กฐ ์œ ํ˜•์˜ ํŒฌ์ด ์•„๋‹ˆ๋ฉฐ ๊ทธ๋“ค์„ ๋‚˜์œ ์ƒ๊ฐ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ์ด์•ผ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์งˆ๋ฌธ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์œ ๋‹ˆ์˜จ ๋ฐ ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Either a b ๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.
(ํžŒํŠธ: https://github.com/Microsoft/TypeScript/issues/2264)

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ์œ ํ˜• ์€ ์žฌ๊ท€์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋ช…๋ชฉ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค . "์˜์‚ฌ ๋ช…๋ชฉ์ƒ"์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

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

type MyType = A | B

๊ทธ๋Ÿฐ ๋‹ค์Œ A ๋ฐ B ๋Œ€ํ•ด ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ... ๋ณด๋„ˆ์Šค๋กœ ์ด๊ฒƒ์€ ๋ชจ๋“  ๊ธฐ์กด JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Thenable ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ด€์šฉ์  ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด์— ์—ฐ๊ฒฐ๋œ then ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ๊ฐ€๋“œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๊ฑฐ์˜ ํ™•์‹คํžˆ.

ํ•˜์•„! ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์˜ ๋นŒ์–ด๋จน์„ ์ข‹์€ ์บ์น˜์ž…๋‹ˆ๋‹ค. ๊ธ€์Ž„์š”, ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ตœ์‹  ๋ฒ„์ „์—์„œ ๋ญ”๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐฉํƒ„ ๋ช…๋ชฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

enum GottaBeNonimalBrand {}
interface GottaBeNonimal {
     branded: GottaBeNonimalBrand;
}
function toGottaBeNominal() : GottaBeNominal {
   return <any> {};
}

์ž ์‹œ๋งŒ ์š”! ๋‹น์‹ ์€ ์†์˜€๋‹ค ! ์ข‹์€ ์˜›๋‚  ๋ฐฉ์‹์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

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

์ข‹์€ ๋ง์”€์ด๋„ค์š” Either ์–ด๋•Œ์š”? ์ •ํ†ต์ด Either GENERICํ•˜๊ณ  ๋‚ด๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์Œ์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์˜ 30 X number_of_combinations_of_any_2_types_in_my_app ๋งŽ์€ ๊ฑฐ๊ธฐ ์•ฝ 30 ํ‘œ์ค€ ํŽธ์˜ ๊ธฐ๋Šฅ์„ ์ด์ œ ๋‚ด๊ฐ€ (๊ณต์นญ) ํ•ด๊ฒฐ ๊ฐˆ ํ•„์š”๊ฐ€ ๋งํ•˜๋Š”, ์ฃผ์œ„ํ•˜๊ณ ์žˆ๋‹ค ๋งž๋‹ฅ ๋œจ๋ฆฌ๋‹ค?

์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ์ „ํžˆ TS ํŒ€์˜ ์‚ฌ๋žŒ๋“ค์— ์˜ํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์žฌ๋ถ€ํŒ… ํ•ด๋ณด๊ณ  ์‹ถ์–ด์š”!
non-null ์œ ํ˜•์ด ๊นจ์ง€์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๊ฒƒ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ช…๋ฐฑํ•ด์กŒ์„ ๋•Œ ๋ง‰ํžŒ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. C# ํŒ€์€ nullable์ด ์•„๋‹Œ ์ฐธ์กฐ ํ˜•์‹์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ฌผ๋ก  ๋™์ผํ•œ ๋ฌธ์ œ, ํŠนํžˆ ํ˜ธํ™˜์„ฑ์— ์ง๋ฉดํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ํ˜„์žฌ ํƒ๊ตฌํ•˜๊ณ  ์žˆ๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค๊ณ  TS์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

C# vnext ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ(๊ฐ„๋‹จํžˆ)

๊ธฐ๋ณธ์ ์œผ๋กœ C#์—๋Š” int ์™€ ๊ฐ™์€ null์ด ์•„๋‹Œ ๊ฐ’ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ C# 2.0์—์„œ int? ์™€ ๊ฐ™์€ nullable ๊ฐ’ ์œ ํ˜•์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ๋Š” ํ•ญ์ƒ null์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. string ๋Š” null์ด ์•„๋‹ˆ๋ฉฐ string? ๋Š” null์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ํฐ ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด string ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ค‘๋‹จํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. null ๋ฅผ string ์— ํ• ๋‹น/๋ฐ˜ํ™˜ํ•ด๋„ ๊ดœ์ฐฎ์•˜์ง€๋งŒ ์ด์ œ๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. C# ํŒ€์€ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ตํŠธ์ธํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ "๋น„ํ™œ์„ฑํ™”"ํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. string? ์ฐ๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์ด ์ƒˆ๋กญ๊ณ  ์ด์ „์—๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•„๋‹˜).
๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ ๋˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ๋ณ„๋กœ ์˜ตํŠธ์ธ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋” ์—„๊ฒฉํ•œ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์„ ํƒํ•˜๋Š” ์™ธ๋ถ€ ์ฝ”๋“œ๊ฐ€ ์ด์ ์„ ์–ป๊ณ  ์ด์ „ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ TS๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  1. null์ด ์•„๋‹Œ ์œ ํ˜•์˜ ์˜ตํŠธ์ธ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ(์ปดํŒŒ์ผ๋Ÿฌ์— ์ „๋‹ฌ) ๋˜๋Š” ํŒŒ์ผ ๋‹จ์œ„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .d.ts ๋Œ€ํ•ด์„œ๋Š” ํ•ญ์ƒ ํŒŒ์ผ๋ณ„๋กœ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ธฐ๋ณธ ์œ ํ˜•์€ nullable์ด ์•„๋‹™๋‹ˆ๋‹ค(์˜ˆ: number . ์ƒˆ๋กœ์šด null ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  3. number? ๋Š” number | null ์˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ์ž…๋‹ˆ๋‹ค.
  4. ์ด ๊ธฐ๋Šฅ์€ ์œ ํ˜• ๊ฐ€๋“œ๊ฐ€ ์—†๋Š” (x: string?) => x.length ์™€ ๊ฐ™์ด nullable ์œ ํ˜•์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.
  5. ์ด ๊ธฐ๋Šฅ์€ let x: string = null; ํ• ๋‹น๊ณผ ๊ฐ™์€ nullable์ด ์•„๋‹Œ ์œ ํ˜•์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.
  6. ์˜ตํŠธ์ธ ๋ฒ”์œ„ ์™ธ๋ถ€์—์„œ ์„ ์–ธ๋œ null์ด ์•„๋‹Œ ์œ ํ˜•์„ ์กฐ์ž‘ํ•  ๋•Œ 5. ์•„๋ž˜์— ๋ณด๊ณ ๋œ ์˜ค๋ฅ˜๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. _ string ๊ฐ€ ์—ฌ์ „ํžˆ string? ๊ฐ„์ฃผ๋œ๋‹ค๋Š” ๊ฒƒ๊ณผ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค._

์ด๊ฒŒ ๋ฌด์Šจ ์†Œ์šฉ์ด์•ผ?

์ƒˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋‚ด ์ฝ”๋“œ์™€ ์—…๋ฐ์ดํŠธ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜์—์„œ ์˜ตํŠธ์ธํ•˜๊ณ  ์™„์ „ํ•œ ์ •์  null ๊ฒ€์‚ฌ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์—†์ด ๋ ˆ๊ฑฐ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ƒˆ ํŒŒ์ผ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  string? ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ ์ ˆํ•œ null ๊ฒ€์‚ฌ ์—†์ด ๋ฉค๋ฒ„์— ์•ก์„ธ์Šคํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ •์˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ด์ ๊ณผ ์—„๊ฒฉํ•œ ๊ฒ€์‚ฌ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ•œ๋ฒˆ .d.ts ์ „๋‹ฌ์— OPTS, null ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜์— length(x: string): number ์—๋Ÿฌ๋œ๋‹ค.
_(์ฐธ๊ณ : string? ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋„ ์˜ค๋ฅ˜์ด์ง€๋งŒ ์˜ตํŠธ์•„์›ƒ ์ฝ”๋“œ์—์„œ string ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.)_

์„ ํƒํ•˜์ง€ ์•Š๋Š” ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์—†์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

๋ฌผ๋ก  ์ด ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ์ง€์— ๋Œ€ํ•ด ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฌํ•œ ์˜ตํŠธ์ธ ๋ฐฉ์‹์ด TS ํŒ€์ด ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

์‚ฌ๋žŒ๋“ค์ด ์ž๋™์ฐจ ๋Œ€์‹  ๋” ๋น ๋ฅธ ๋ง์„ ์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๊ฒธ์†ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ADT์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์ฝ์—ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์ œ๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ "TS์˜ ADT ์ง€์›"์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ์—์„œ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๊ฒƒ๋“ค์ด ์ข‹์€์ง€, ์™œ ํ•„์š”ํ•œ์ง€, nullable์ด ์•„๋‹Œ ์œ ํ˜•์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์„ ์™„ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” nullable์ด ์•„๋‹Œ ์œ ํ˜•์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ ์‹ค์ œ๋กœ ์ฃผ์ œ๋ฅผ ๊ฐ€๋กœ์ฑ„๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์€ ์ƒ์ˆ˜ ์ „ํŒŒ๋ผ๊ณ  ํ•˜๋ฉฐ ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ null ๋ฐ undefined ๋œ 2๊ฐœ์˜ ์ž„์˜ ์ƒ์ˆ˜์— ์˜ํ•ด์„œ๋งŒ ์ œํ•œ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด, ์ˆซ์ž ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๋ฐฉ๋ฒ•์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ๊บผ์ด ์›ํ•˜์ง€ ์•Š๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ž˜๋œ ์Šต๊ด€์„ ๊ธฐ๋ฅด๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@aleksey-bykov ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๋” ๋‚˜์€ ์œ ํ˜• ์ œํ•œ์„ ์–ป์œผ๋ ค๋ฉด ๋” ๋†’์€ ์ข…๋ฅ˜์˜ ์œ ํ˜•์„ ๊ตฌํ˜„ํ•˜๊ณ  ํŒŒ์ƒ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์œผ๋ ค๋ฉด ์œ ํ˜• ํด๋ž˜์Šค ๋“ฑ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. TypeScript์˜ "align with ES6+" ๋””์ž์ธ ๋ชฉํ‘œ์™€ ์–ด๋–ป๊ฒŒ ์ผ์น˜ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์ด ๋ฌธ์ œ์˜ ์›๋ž˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์—ฌ์ „ํžˆ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์—๋„(๊ณต์šฉ์ฒด ์œ ํ˜• ์—†์ด) ์ผ๋ฐ˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TS์—์„œ Maybe(๋˜๋Š” ์–ด๋Š ์ชฝ์ด๋“ )๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Java์— Optional ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒํผ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ null ์–ด๋”˜๊ฐ€์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ์„ ํƒ์  ์†์„ฑ์ด ํ•„์š”ํ•˜๊ณ  ์–ธ์–ด ์ž์ฒด๋Š” ๋ถˆํ‰ํ•˜์ง€ ์•Š์ง€๋งŒ ๋Ÿฐํƒ€์ž„์— ์ƒํ™ฉ์ด ํญ๋ฐœํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์™œ ๋‹น์‹ ์ด ์–ธ์–ด๋ฅผ ๋‚จ์šฉํ•˜์—ฌ ๊ฒฐ์ฝ” ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ๋ถ€๋ฆด ์ˆ˜ ์žˆ๋„๋ก ์ฃผ์žฅํ•˜๋Š”์ง€ ๋‚˜์—๊ฒŒ๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ์žˆ๊ณ  null ๊ฐ’์ด ์—†๋Š” ๊ธฐ๋Šฅ์  ์–ธ์–ด๋ฅผ ์›ํ•˜๋ฉด PureScript๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ฒฐํ•ฉ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ํ›Œ๋ฅญํ•˜๊ณ  ์ž˜ ์„ค๊ณ„๋œ ์–ธ์–ด์ด๋ฉฐ Haskell์˜ ์ถ•์ ๋œ ์‚ฌ๋งˆ๊ท€ ์—†์ด Haskell์—์„œ ์ˆ˜๋…„๊ฐ„ ์ „ํˆฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค(์›์น™์ ์ธ ์œ ํ˜• ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ, ํ–‰ ๋‹คํ˜•์„ฑ์ด ์žˆ๋Š” ์‹ค์ œ ๋ ˆ์ฝ”๋“œ...). ๋‚ด ์ƒ๊ฐ์—๋Š” ์›์น™๊ณผ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜๋Š” ์–ธ์–ด๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๋ฐฉ๋ฒ•์„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

PureScript์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํผ๋ฒ ์ด์‹œ๋ธŒ ์ปค๋ง์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ํ์‡„์ž…๋‹ˆ๊นŒ?

@jods4 ๋Š” ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  .d.ts ํŒŒ์ผ์ด out-of-work ํ”Œ๋ž˜๊ทธ๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•˜๊ฑฐ๋‚˜ ํ”„๋กœ์ ํŠธ ์ „์ฒด ์„ค์ •์ด .d.ts(๋ฐ .d.ts ํ”Œ๋ž˜๊ทธ ์—†์ด๋Š” ํ•ญ์ƒ '์˜ค๋ž˜๋œ' ๋ฐฉ์‹์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์–ผ๋งˆ๋‚˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(.d.ts ํŒŒ์ผ์„ ์ฝ์„ ๋•Œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ฑฐ๋‚˜ ํ˜ผ๋ž€์„ ์ผ์œผํ‚ค๋‚˜์š”?)?
์ƒˆ ์ฝ”๋“œ์™€ ์ด์ „(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ์ฝ”๋“œ ๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ? (๊ฒฝ์šฐ์— ๋”ฐ๋ผ) ๋ถˆํ•„์š”ํ•œ ๊ฒ€์‚ฌ์™€ ์บ์ŠคํŠธ๋กœ ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋ ๊นŒ์š”?
๋Œ€๋ถ€๋ถ„ ๋‚˜๋Š” (ํ˜„์žฌ) nullable์ด ์•„๋‹Œ ์œ ํ˜•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜๋ฉฐ @jods4 ๋ฐ ! Suggestion์˜ ์ œ์•ˆ์€ nullable์ด ์•„๋‹Œ ์œ ํ˜•์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค(adts ๋ฌด์‹œ).

์ด ์Šค๋ ˆ๋“œ์—์„œ ์†์‹ค๋˜์—ˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์•”์‹œํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ตœ๊ทผ์— ๋ณธ ์ฃผ์žฅ์€ "๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ TypeScript์—์„œ ์ผ์ข…์˜ ๊ธฐ๊ณ„ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์œ ์šฉํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. null ๋ฐ undefined ๊ฐ’์ด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ฅผ ๊ธฐ๋ณธ ์–ธ์–ด๊ฐ€ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๋Œ€์‹  ์ฝ”๋“œ์— ๋„ฃ๊ณ  ์‹ถ์€ ๊ณ ์ฐจ ๋…ผ๋ฆฌ๋กœ ๋ณด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. .

๋‹ค๋ฅธ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด undefined ๋ฅผ ์ƒ์ˆ˜ ๋˜๋Š” ํ‚ค์›Œ๋“œ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ๋„ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์—ญ ์ปจํ…์ŠคํŠธ์—๋Š” ๊ธฐ๋ณธ ์œ ํ˜• undefined ์ธ ๋ณ€์ˆ˜/์†์„ฑ undefined ์ด ์žˆ์Šต๋‹ˆ๋‹ค. null ๋Š” ๋ฆฌํ„ฐ๋Ÿด์ž…๋‹ˆ๋‹ค ( typeof "object" ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌํ˜„๋œ ์˜ค๋žœ ๋ฒ„๊ทธ์ด๊ธด ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์œ ํ˜• null ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค). ECMAScript์—์„œ ์ด ๋‘ ๊ฐ€์ง€๋Š” ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

@kitsonk
๋ฌธ์ œ๋Š” ๋ชจ๋“  ์œ ํ˜•์ด null์ผ ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  ์œ ํ˜•์ด ์ •์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํŠน์ • ์œ ํ˜•์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์ด null ๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’(์˜ˆ: ๋‚˜๋ˆ„๊ธฐ)์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์•„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋“ค์ด ์›ํ•˜๋Š” ๊ฒƒ์€ ์œ ํ˜•์„ "์ˆซ์ž์ด๋ฉฐ ๊ฒฐ์ฝ” null์ด๊ฑฐ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์€" ๊ฒƒ์œผ๋กœ ์ง€์ •ํ•˜์—ฌ null ๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ๋„์ž…ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ž˜๋ชป๋œ ๊ฐ’์— ๋Œ€ํ•ด ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ฐ’์„ "์ด ์œ ํ˜•์ด์ง€๋งŒ null์ด๊ฑฐ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์—†์Œ"์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ธ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
A) ์ด ๊ฐ’์ด null์ด๊ฑฐ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๋ช…๋ฐฑํ•ฉ๋‹ˆ๋‹ค.
B) ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ˆ„๋ฝ๋œ ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์žก๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ •์˜๋˜์ง€ ์•Š์€ ๊ธฐ๋ณธ ์œ ํ˜•์˜ ๋ณ€์ˆ˜/์†์„ฑ์ด ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. null์€ ๋ฆฌํ„ฐ๋Ÿด์ž…๋‹ˆ๋‹ค(๊ธฐ๋ณธ ์œ ํ˜• null์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

@kitsonk ์ด๊ฒƒ์€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ๋…ผ๊ฑฐ์ž…๋‹ˆ๋‹ค. null A๊ฐ€ ์•„๋‹Œ number A, ๊ทธ๊ฒƒ์€ ๋” ์ด์ƒ ๊ฒƒ Person (A)๋ณด๋‹ค Car ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ณ ์œ ํ•œ ์œ ํ˜•์ด๋ฉฐ ์ด ๋ฌธ์ œ๋Š” typescript๊ฐ€ ์ด๋Ÿฌํ•œ ๊ตฌ๋ณ„์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@kitsonk ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜ ์ค‘ ํ•˜๋‚˜๋Š” null ์ฐธ์กฐ/์•ก์„ธ์Šค ์ •์˜๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. null/undefined๊ฐ€ ์•„๋‹Œ ์†์„ฑ์ด๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์†Œํ”„ํŠธ์›จ์–ด ์ฝ”๋“œ๊ฐ€ ๋” ํ™•์‹คํ•ด์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ LS์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ https://github.com/Microsoft/TypeScript/issues/3692 ์™€ ๊ฐ™์€ ๋ฒ„๊ทธ๋ฅผ ์žก์„ ์ˆ˜

์„ค๋ช…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‚ดํŽด๋ณด๋‹ˆ ์—ฌ๊ธฐ์—์„œ๋„ ๋ญ”๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... TypeScript์— ์ด๋ฏธ "์„ ํƒ ์‚ฌํ•ญ" ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ๋‹ค์Œ์ด ์ œ์•ˆ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

interface Mixed {
    optional?: string;
    notOptional: string;
    nonNullable!: string;
}

function mixed(notOptional: string, notNullable!: string, optional?: string): void {}

์ œ์•ˆ๋œ ์†”๋ฃจ์…˜ ์ค‘ ์ผ๋ถ€์—๋Š” ๋” ํฐ ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ์œ ํ˜• ๋ณดํ˜ธ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (TypeScript์˜ ๋‚ด๋ถ€ ์ž‘๋™์„ ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ) ์ด๋ฏธ ํ™•์ธ ์ค‘์ธ ๊ฒƒ์˜ ํ™•์žฅ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

TypeScript์—๋Š” ์ด๋ฏธ "์„ ํƒ ์‚ฌํ•ญ" ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ๋‹ค์Œ์ด ์ œ์•ˆ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

TS์—์„œ ์ง€๊ธˆ ์„ ํƒ ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋™์•ˆ์—๋งŒ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. Null ๋ฐ undefined ๋Š” ์—ฌ์ „ํžˆ ๋ชจ๋“  ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์˜ ์ง๊ด€์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

interface A {
   a?: string;
}
let a: A = {} // ok as expected

interface B {
   b: string;
}
let b1: B = { b: undefined } //ok, but unintuitive
let b2: B = { b: null } // ok, but unintuitive
let b3: B = {} // error as expected

๋˜๋Š” TS์—์„œ optional ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ œ์•ˆ์€ undefined ๋ฐ null์„ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์—†๋Š”(null์ด ์•„๋‹Œ, ์ •์˜๋˜์ง€ ์•Š์€) ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

? ๋Š” ์†์„ฑ/์ธ์ˆ˜ ์ด๋ฆ„์˜ _์กด์žฌ_๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์†์„ฑ/์ธ์ˆ˜ ์ด๋ฆ„ ์˜†์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. @tinganho ๊ฐ€ ์ž˜ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ ์˜ˆ๋ฅผ ํ™•์žฅ:

function foo(arg: string, another?: string) {
  return arguments.length;
}

var a: A = {};
a.hasOwnProperty('a') // false
foo('yo') // 1, because the second argument is _non-existent_.
foo(null) // this is also ok, but unintuitive

null์ด ์•„๋‹Œ ! ๋Š” ์ด๋ฆ„์˜ _existence_์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์œ ํ˜•๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฏ€๋กœ ์œ ํ˜•๋ณ„๋กœ ๋ฐฐ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹์€ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

interface C {
  c: !string;
}

let c1: C = { }; // error, as expected
let c2: C = { c: null }; // error, finally!
let c3: C = { c: 'str' }; // ok! :)

function bar(arg: !string) {
  return arg.length;
}

bar(null) // type error
bar('foo') // 3

@Griffork ๊ธฐ์กด .d.ts ๋Š” ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ ๋” ์—„๊ฒฉํ•œ ์ •์˜๋ฅผ ์ง€์›ํ•˜๋„๋ก ์›ํ™œํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ .d.ts ๋Š” ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ null์ด ์•„๋‹Œ ์ถฉ์‹คํ•œ ์ •์˜๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ ํŒŒ์ผ ์ƒ๋‹จ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์†Œ๋น„์ž์˜ ์ƒ๊ฐ/๊ตฌ์„ฑ ์—†์ด ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@kitsonk ์ด๊ฒƒ์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด null์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฑฐ๋‚˜ null์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์— null์„ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์ž˜ ๋ชจ๋ฅด๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. let x = array.sum(x => x.value) ํ•˜๋ฉด x ๊ฐ€ null์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐฐ์—ด์ด ๋น„์–ด ์žˆ์œผ๋ฉด 0์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ์•„์„ธ์š”? ์ปฌ๋ ‰์…˜์— x.value === null ๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๊นŒ? sum() ํ•จ์ˆ˜์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ ๊นŒ์š”?
์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ •์ ์œผ๋กœ ๊ฒ€์‚ฌ๋˜๊ณ  ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์— null ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๊ฒ€์‚ฌ ์—†์ด null ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฐ’์„ ์†Œ๋น„ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ์™„์ „ํ•œ ํ˜•์‹์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋” ์ด์ƒ "NullReferenceException"์ด ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ถˆํ–‰ํ•˜๊ฒŒ๋„ undefined ๊ด€๋ จ ์ฝ”๋„ˆ ์ผ€์ด์Šค ์ œ์™ธ).

์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. null ํ—ˆ์šฉ ์—ฌ๋ถ€๋Š” ๋ณ€์ˆ˜/๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ์ด ์•„๋‹ˆ๋ผ ์œ ํ˜• ์‹œ์Šคํ…œ๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ ์œ ํ˜• ๊ฐ€๋“œ, ๊ณต์šฉ์ฒด ๋ฐ ๊ต์ฐจ ์œ ํ˜• ๋“ฑ๊ณผ ์ž˜ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.

_void_ ์œ ํ˜•์—๋Š” ๊ฐ’์ด ์—†์ง€๋งŒ null ๋ฐ undefined ๊ฐ’์„ ๋ชจ๋‘ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ข‹์€ ์š”์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/Microsoft/TypeScript/issues/185#issuecomment -71942237

@jbondc ์ตœ๊ทผ์— ์‚ฌ์–‘์„ ํ™•์ธํ•œ ๊ฒƒ ๊ฐ™์•„์š”. void ๋Š” null ๋ฐ undefined ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ์šฉ์–ด์ž…๋‹ˆ๋‹ค. void 0 ์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ void ๋„ ์šฐ์‚ฐ ์•„๋ž˜์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

any ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ null ๋ฐ undefined ๋Š” ์—ฌ์ „ํžˆ ๋ชจ๋“  ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

void 0 ํ•ญ์ƒ undefined ๋„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค . http://stackoverflow.com/a/7452352/449132.

@jbondc ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž ์žฌ์ ์ธ null ์ธ์‹ ์œ ํ˜• ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ธ ๊ฒฝ์šฐ

function returnsNull() {
  return null;
}

null ์œ ํ˜•์„ ์œ ์ถ”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

undefined ์ฃผ๋ณ€์— ๋งŽ์€ ์ฝ”๋„ˆ ์ผ€์ด์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ ์†”์งํžˆ ๋งํ•ด์„œ ์ €๋Š” (์•„์ง?) ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ธ์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๊ธฐ ์ „์— TS ํŒ€์ด ์˜ตํŠธ์ธ ์ „๋žต์— ๋Œ€ํ•ด ๊ดœ์ฐฎ์€์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด ํ† ๋ก ์— ์ฐธ์—ฌํ–ˆ์„ ๋•Œ "์šฐ๋ฆฌ๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ ์ฃผ๋ณ€ ํ”Œ๋ž˜๊ทธ/์˜ต์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์†Œ์Šค ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋กœ ๋๋งบ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ์•„์ด๋””์–ด๋Š” ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ์ด ์•„๋‹ˆ๋ฉฐ 100%๋Š” ์•„๋‹ˆ์ง€๋งŒ ์†Œ์Šค ํ•ด์„๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ƒ๋Œ€์ ์œผ๋กœ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ ํšŒ์ƒ‰ ์˜์—ญ์ด ๋‚ด๊ฐ€ TS ํŒ€์˜ ์ƒ๊ฐ์„ ๋ฌป๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

@jods4 ๊ธฐ์กด ๊ตฌ๋ฌธ์„ ์œ ์ง€ํ•˜๋Š” ์ถ”๋ก ๋œ nullable any ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ตํŠธ์ธ ์ „๋žต์ด ๋ฐ”๋žŒ์งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. [1]

nullable์ด ์•„๋‹Œ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ช…์‹œ์  ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด์˜ ๊ฒฝ์šฐ ํ•œ ๋ฒˆ์— ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ ํƒ์  ์ธ์ˆ˜๋Š” ๋ช…๋ฐฑํ•œ ์ด์œ ๋กœ ํ•ญ์ƒ null์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ). ๊ธฐ๋ณธ ์ธ์ˆ˜๋Š” ์™ธ๋ถ€์ ์œผ๋กœ๋Š” ํ˜„์žฌ ์„œ๋ช…์„ ์œ ์ง€ํ•ด์•ผ ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ ์ž์ฒด ๋‚ด๋ถ€์—์„œ๋Š” ์ธ์ˆ˜๋ฅผ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ nullable ์ˆซ์ž๋Š” ์—”์ง„์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์ตœ์ ํ™”๋ฅผ ๊นจ๊ณ  ์„ ํƒ์ /๊ธฐ๋ณธ ์ธ์ˆ˜ ์ด์™ธ์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ํ„ฐ๋ฌด๋‹ˆ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์„ ํƒ์  ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆซ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ๋” ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ๊นจ์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋ช…์‹œ์ ์œผ๋กœ nullable ํ˜•์‹์„ ํ‘œ์‹œํ•˜๋Š” ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ด ํ† ๋ก ์˜ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋กœ ์ด๋ฏธ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

[1] ์ด๊ฒƒ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์šฉ์ ์ธ ์ด์œ ๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด --noImplicitAny ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง๋ฉดํ•œ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ์ด๋กœ ์ธํ•ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์œ„ํ—˜์ด ๋ฐœ์ƒํ–ˆ๊ณ , ์†์„ฑ ์กด์žฌ๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๋ฐ ์‹ค์งˆ์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒ ํ•˜์—ฌ --suppressImplicitAnyIndexErrors , ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ž˜๋ชป๋œ ConfirmlyTyped ์ •์˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

@impinball

๊ธฐ์กด ๊ตฌ๋ฌธ์„ ์œ ์ง€ํ•˜๋Š” ์œ ์ถ”๋œ nullable any ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ตํŠธ์ธ ์ „๋žต์ด ๋ฐ”๋žŒ์งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋‚ด ๋‹ต๋ณ€์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•”๋ฌต์ ์œผ๋กœ null ์œ ํ˜•๋งŒ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ: () => null ๋˜๋Š” let x = null ๋˜๋Š” function y() { return null } .

๋”ฐ๋ผ์„œ any ๊ณ„์† ์ถ”๋ก ํ•˜๋Š” ๊ฒƒ์ด ์•„๋งˆ๋„ ์ข‹์€ ์ผ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  2. ๊ทธ ๋ชจ๋“  ๊ฒฝ์šฐ๋Š” ์–ด์จŒ๋“  noImplicitAny ์•„๋ž˜์˜ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.
  3. ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ ์ด์ƒํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ณ  ์œ ์šฉํ•œ ๊ฒฝ์šฐ (): null => null ๋˜๋Š” let x: null = null ๋˜๋Š” function y(): null { return null } ์œ ํ˜•์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

nullable์ด ์•„๋‹Œ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ช…์‹œ์  ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด์˜ ๊ฒฝ์šฐ ํ•œ ๋ฒˆ์— ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

string ์‹ค์ œ๋กœ string! | null ์˜๋ฏธํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋ชจ๋“  ๋…ผ์˜๋ฅผ ์ฝ์œผ๋ฉด ๊ธฐ์กด ์ฝ”๋“œ์™€ ๋” ํ˜ธํ™˜๋  ๊ฒƒ์ด๋ผ๋Š” ํฌ๋ง์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์— ์ œ์•ˆ๋œ ๊ฒƒ์ž„์„ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( string ์˜ ํ˜„์žฌ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ). ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์‹ค ๊ฒฐ๋ก ์€ ๊ทธ๋ ‡๋‹ค ํ•ด๋„ ์—„์ฒญ๋‚œ ์–‘์˜ ์ฝ”๋“œ๊ฐ€ ๊นจ์งˆ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

nullable์ด ์•„๋‹Œ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์‚ฌ์†Œํ•œ ์ „ํ™˜์ด ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ string! ๋ณด๋‹ค string? ์˜ต์…˜์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๋” ๊น”๋”ํ•ด ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ TS ์ปดํŒŒ์ผ๋Ÿฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๊ฑฐ์˜ ๋ชจ๋“  ๋‚ด๋ถ€ ์œ ํ˜•์˜ ์ด๋ฆ„์ด ๋ถ€์ •ํ™•ํ•˜๊ฒŒ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์„ ํƒ์  ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆซ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ๋” ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ๊นจ์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋ช…์‹œ์ ์œผ๋กœ nullable ํ˜•์‹์„ ํ‘œ์‹œํ•˜๋Š” ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ด ํ† ๋ก ์˜ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋กœ ์ด๋ฏธ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์ƒํ™ฉ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ string? ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ข‹์€ ์ฃผ์žฅ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. number? ์™€ string! ํ˜ผ๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋นจ๋ฆฌ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค.

[1] ์ด๊ฒƒ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์šฉ์ ์ธ ์ด์œ ๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ:

  1. ์ƒˆ๋กœ์šด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋” ๋‚˜์€ ๋ฏธ๋ž˜๋ฅผ ๊ฑด์„คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ธฐ์กด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์€ ์˜ตํŠธ์ธํ•˜์ง€ ์•Š๋”๋ผ๋„ _์ผ๋ถ€_ ํ˜œํƒ๊ณผ ์ถ”๊ฐ€ ํ™•์ธ์„ ๊ฑฐ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  3. ๊ธฐ์กด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์€ ํŒŒ์ผ ๋‹จ์œ„๋กœ ์˜ตํŠธ์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ ์ฝ”๋“œ๋ฅผ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ „ ์ฝ”๋“œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jods4

์ด ์‹œ์ ์—์„œ ์ƒํ™ฉ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ข‹์€ ์ฃผ์žฅ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๊นŒ? ์–ด๋””์—๋‚˜. ์ˆซ์ž๊ฐ€ ์„ž์ด๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  string!, ์ด๊ฒƒ์€ ๋„ˆ๋ฌด ๋นจ๋ฆฌ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ๊ทธ๋Ÿฐ ๋œป์ด ์•„๋‹ˆ์—ˆ์–ด์š”. ๋‚˜๋Š” nullable ๋ฌธ์ž์—ด๋ณด๋‹ค nullable ์ˆซ์ž์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์ œ์•ˆ์— ๊ทธ๋ ‡๊ฒŒ ์ง‘์ฐฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  (๋‚˜๋Š” ์–ด๋Š ์ชฝ์ด๋“  ์ƒ๊ด€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๊ธฐ์กด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์€ ํŒŒ์ผ ๋‹จ์œ„๋กœ ์˜ตํŠธ์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ ์ฝ”๋“œ๋ฅผ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ „ ์ฝ”๋“œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์Šจ ์˜๋ฏธ๋กœ? ํ˜„์žฌ ํŒŒ์ผ๋ณ„๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ํ‹€๋ ธ๋‹ค๋Š” ๊ฒƒ์ด ์ฆ๋ช…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@impinball

๋ฌด์Šจ ์˜๋ฏธ๋กœ? ํ˜„์žฌ ํŒŒ์ผ๋ณ„๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ํ‹€๋ ธ๋‹ค๋Š” ๊ฒƒ์ด ์ฆ๋ช…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•œ ์ ์ด ์—†์ง€๋งŒ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ณผ ๋•Œ // <strong i="9">@module</strong> amd ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋งŽ์€ ์ฃผ์„์„ ๋ด…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ ๊ทธ๊ฒƒ์ด ts ํŒŒ์ผ ๋‚ด๋ถ€์—์„œ ์˜ต์…˜์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•œ ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค! ์—ฌ๊ธฐ์—์„œ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์„ธ์š”.
https://github.com/Microsoft/TypeScript/blob/master/tests/cases/conformance/externalModules/amdImportAsPrimaryExpression.ts

์ด๊ฒƒ์ด ํŒŒ์ผ๋ณ„ ์˜ต์…˜์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ๋ฉด ์ƒˆ๋กœ์šด ๊ฒƒ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .d.ts ํŒŒ์ผ์— ๋Œ€ํ•ด _์ ์–ด๋„_ ํŒŒ์ผ๋ณ„๋กœ ์ด ์˜ต์…˜์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋งจ ์œ„์— ์žˆ๋Š” ํŠน๋ณ„ํ•œ ํ˜•์‹์˜ ์ฃผ์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ /// <amd-dependency /> ๋ฐ co๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๋‚˜๋Š” ํ‹€๋ ธ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ Spelunkingํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ๋งˆ์ปค๋ผ๊ณ  ํ•˜๋ฉฐ FourSlash ๋Ÿฌ๋„ˆ์— ์˜ํ•ด ์‚ฌ์ „ ๊ตฌ๋ฌธ ๋ถ„์„๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ์šฉ์ผ ๋ฟ์ด๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด๋ถ€์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒˆ๋กœ์šด ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐพ์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์‹ค์šฉ์ ์ธ ์ œํ•œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ES6 ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ธ์ˆ˜์—๋Š” ๊ฐ€์žฅ ์‹ค์šฉ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์™„์ „ํžˆ ๋‹ค์‹œ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  IIUC ํƒ€์ž… ๊ฒ€์‚ฌ๋Š” ์• ์ดˆ์— AST ์ƒ์„ฑ๊ณผ ๋™์ผํ•œ ํŒจ์Šค์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

ํŒŒ์„œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด /// <amd-dependency /> ๋ฐ /// <amd-module /> ์ฃผ์„์ด ํŒŒ์ผ์—์„œ ํŒŒ์‹ฑ๋˜๊ธฐ ์ „์— ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. /// <non-null-types /> ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋„ค, ๊ทธ๊ฑด ๋”์ฐํ•œ ๋ช…๋ช…์ด๊ณ  ์ €๋Š” ์ž„์˜์˜ "๋งˆ๋ฒ•" ์˜ต์…˜์˜ ํ™•์‚ฐ์— ์ฐฌ์„ฑํ•˜์ง€ ์•Š์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์•„์ด๋””์–ด์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

@ jods4 ๋‚˜๋Š” @I 'm ํ•€๋ณผ์€ ์‹ญ์˜ค ๊ตฌ๋ฌธ์ด ์ž‘ํ’ˆ์„ ๊ฐ•์กฐํ•˜๋Š” ๋ฐฉ์‹์— ํฐ ๋ณ€ํ™”์—†์ด ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

2.0์—๋Š” null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํ˜•์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฒฐ๊ตญ typescript๋Š” ์œ ํ˜•์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๊ณ  typescript์— ์˜ํ•ด ๋„์ž…๋œ ์žฌ์ž‘์„ฑ ํ›„์— ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
IntelliSense๊ฐ€ ๋” ๋‚ซ์Šต๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ๋‚ด๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ์ˆ˜๋™์œผ๋กœ ๋˜๋Š” ์ฝ”๋“œ๋ณ„๋กœ ์œ ํ˜•์„ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค. TypeScript 1.6์€ ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ๋ชจ๋ธ๋งํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ํ‘œํ˜„๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null ๋ฐ undefined ๊ฐ’์œผ๋กœ ์ธ์ฝ”๋”ฉ๋จ). ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ํŒจํ„ด์€ nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

declare module Nothing { export const enum Brand {} }
interface Nothing { 'a brand': Nothing.Brand }
export type Nullable<a> = a | Nothing;
var nothing : Nothing = null;
export function isNothing(value: Nullable<a>): value is Nothing {
    return value == null;
}
var something = Math.random() > 0.5 ? 'hey!' : nothing;
if (isNothing(something)) {
    // missing value
    // there is no way you can get anything out of it
    // there is also NO WAY to get a null reference exception out of it
    // because it doesn't have any methods or properties that could be examined
    // it is 100% explicit and typesafe to use
} else {
    // value is present, it is 100% GUARANTEED being NON-NULL
    // you just CANT get a null reference exception here either
    console.log(something.toLowerCase());
}

/** turns any unsafe values into safe ones */
export function sanitize<a>(unsafe: a) : Nullable<a> {
    return unsafe;
}

var safe = sanitize(toResultFromExternalCodeYouCannotTrust()); // <-- 100% safe to use

๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์„ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ€์ด์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ์ˆ˜์—…์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@aleksey-bykov

๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์„ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์‹ฌ๊ฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค, ๊ทธ๋ ‡์ง€? nullable ๋Œ€์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•œ ํŒจํ„ด์€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ์˜ ๋ชจ๋“  var x: number ์„ Nullable<number> ๋˜๋Š” ๋” ๋‚˜์€ NonNullable<x> ๋กœ ๋ž˜ํ•‘ํ•˜์ง€ _์•Š์Šต๋‹ˆ๋‹ค_. ๋„ˆ๋ฌด ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ x *= 2 ๊ฒƒ์ด ๋‚ด ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ 100% ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” _๋ชจ๋“ _ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ sanitize ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ _์•Š์Šต๋‹ˆ๋‹ค_. ๋‚ด๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋‚ด์žฅ DOM API๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋‚˜๋Š” isNothing(safe) _์‚ฌ๋ฐฉ์—_๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ let squares = [1,2,3].map(x => x*x) ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ  ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— squares.length ๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ 100% ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” _any_ API๋กœ.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•จ์ˆ˜๊ฐ€ null ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์ˆ˜๋ฝํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์‚ฌ JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. $(element).css(null) ๊ฐ€ ์ •์ƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด ์˜ค๋ฅ˜์ธ์ง€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋‹น์‹ ๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ํŒจํ„ด์„ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†๋Š” ํŒ€ ํ™˜๊ฒฝ์—์„œ ์ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ Nulllable ์œ ํ˜•์€ ๊ฐœ๋ฐœ์ž๊ฐ€ let x: number = null; x.toString() (๋˜๋Š” ๋œ ๋ฉ์ฒญํ•˜์ง€๋งŒ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ด๋Š” ๊ฒƒ)์„ ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์ „ํ˜€ ์•„๋ฌด ์—ญํ• ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋“ฑ๋“ฑ. ์ด ํ‹ฐ์ผ“์€ _๋ฉ€๋ฆฌ_ ์ข…๋ฃŒ๋˜์—ˆ์œผ๋ฉฐ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ 100% ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์‹ฌ๊ฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค, ๊ทธ๋ ‡์ง€?

๋‚˜๋Š” ๊ฝค ์ง„์ง€ํ•˜๋‹ค.

์ผ์ผ์ด ํฌ์žฅํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค...

์™œ ์•ˆ ๋ผ? ! ๊ตฌ๋ฌธ์ด๋‚˜ ์—ฌ๋Ÿฌ๋ถ„์ด ์ถ”์ง„ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌด์—‡์ด๋“  ์‚ฌ์šฉํ•˜๋ฉด ์–ด์จŒ๋“  ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ๋” ๋‚˜์€ NonNullable

๊ทธ๊ฒƒ์€ ๋น„ - ๋„ (NULL) ๊ฐ’ ๋˜๋Š” null์„ ๊ฐ€์งˆ ์ˆ˜ nullable ํ˜•์‹์ด๋ฉฐ, ๋ช…์‹œ ์ ์œผ๋กœ ์–ธ๊ธ‰๋˜์–ด ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋ธ๋ง Null ํ—ˆ์šฉ์„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ฐ’ ๋˜๋Š” null์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  number ๋กœ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์กด ์œ ํ˜•๊ณผ ๋‹ฌ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— null์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ์ž…๋‹ˆ๋‹ค.

์–ด๋””์—?

๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๋‚ด์žฅ DOM API์— ๋Œ€ํ•ด Sanitize๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. null์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ Nullable<*> ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ํ•ด๋‹น ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ •์˜ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•จ์ˆ˜๊ฐ€ null์„ ์ž…๋ ฅ์œผ๋กœ ํ—ˆ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ํƒ€์‚ฌ JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ๊ฒƒ. ๊ทธ ๋ฉ”์„œ๋“œ๋ฅผ ์ผ๋ฐ˜ string ๋Œ€์‹  Nullable<string> ๋ฅผ ์ˆ˜๋ฝํ•˜๋„๋ก ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Nullable ์œ ํ˜•์€ ๊ฐœ๋ฐœ์ž๊ฐ€ let x: number = null; x.toString()

๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. linter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ null ํ‚ค์›Œ๋“œ๋ฅผ ๊ธˆ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์†”๋ฃจ์…˜์€ 95% ์ž‘๋™ํ•˜๊ณ  100% ์‹ค์šฉ์ ์ด๋ฉฐ ์–ด๋ ค์šด ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ฑฐ๋‚˜ ๋ชจ๋“  ์‚ฌ๋žŒ์„ ๊ฐ™์€ ํŽ˜์ด์ง€๋กœ ๋งŒ๋“ค ํ•„์š” ์—†์ด ์˜ค๋Š˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์ถ”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š” ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜ ๋˜๋Š” ๋ชจ๋“  ๋ฐฑ ์žญ๊ณผ ์ฒด๋ฆฌ๋ฅผ ๋งจ ์œ„์— ๋†“๊ณ  ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์–ป๋Š” ๊ฒƒ

1.4 ๋ฐ 1.5, ๋ฌดํšจ ํ˜•์€๋กœ .toString () ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„, ๊ทธ๋ž˜์„œ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค type Nothing = void; ๋Œ€์‹  (์ด 1.6์—์„œ ๋‹ค์‹œ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•œ) ๋ชจ๋“ˆ์„ ํ•„์š”๋กœ์˜ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. http://bit.ly/1OC5h8d

@aleksey-bykov ๊ทธ๊ฑด ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. null์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“  ๊ฐ’์„ ์‚ญ์ œํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žŠ์–ด๋ฒ„๋ฆฌ๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์กฐ์‹ฌํ•ด์•ผ ํ•  ๊ณณ์ด ์ ์Œ).

๋˜ํ•œ ํ•ดํ‚น์ด ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

if (isNothing(something)) {
  console.log(something.toString())
}

์ผ์ผ์ด ํฌ์žฅํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค...

์™œ ์•ˆ ๋ผ? ์™€ ํ•จ๊ป˜ ! ๊ตฌ๋ฌธ์ด๋‚˜ ์—ฌ๋Ÿฌ๋ถ„์ด ์ถ”์ง„ํ•˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ์–ด์จŒ๋“  ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ด ํ•ด๊ฒฐ๋œ๋‹ค๋ฉด ์ €๋Š” _ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค_. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ํ•ด๊ฒฐ๋œ๋‹ค๋ฉด TS๋Š” ์ด๋ฅผ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ์–ธ์–ด ์„คํƒ•์„ ๊ณ ๋ คํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ๋” ๋‚˜์€ NonNullable

์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์€ nullable์ด์–ด์•ผ ํ•˜๋ฉฐ nullable์ด ์•„๋‹Œ ๊ฐ’์ด๋‚˜ null์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” nullable ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ฐ’ ๋˜๋Š” null์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  number๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์กด ์œ ํ˜•๊ณผ ๋‹ฌ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— null์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

null ์˜ˆ์™ธ๋ฅผ ์—†์• ๊ณ  ์‹ถ์€ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. nullable์ด ์•„๋‹Œ ์œ ํ˜•๋„ ์ •์  ์•ˆ์ „์„ฑ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.
ํ•ญ์ƒ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. toString() ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ญ์ƒ null์ด ์•„๋‹Œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๊ฑฐ๊ธฐ์— ๋‹น์‹ ์˜ ์„ ํƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
let x: string = a.toString();
x.length ๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๋Š” ์ •์  ๊ฒ€์ฆ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ๋‚ด์žฅ string ๋Š” null ์žˆ์œผ๋ฏ€๋กœ _status quo_์ž…๋‹ˆ๋‹ค.
let x = sanitize(a.toString());
์ด์ œ null ๊ฒ€์‚ฌ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ _is_ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด ์ฝ”๋“œ์—์„œ x ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ณณ์— if (isNothing(x)) ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค! x ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— null์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ž˜ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์•…ํ•˜๊ณ  ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. (<string>x).length ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด์ง€๋งŒ x ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ง€์˜ฅ์ฒ˜๋Ÿผ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€:

let x = a.toString(); // documented, non-null type string (string! if you want to)
x.length; // statically OK

์ ์ ˆํ•œ ์–ธ์–ด ์ง€์› ์—†์ด๋Š” ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. JS(๋ฐ TS 1.6)์˜ ๋ชจ๋“  ์œ ํ˜•์€ ํ•ญ์ƒ null์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹Œ(nullable) ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งค์šฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์˜ˆ์™ธ๊ฐ€ ์•„๋‹Œ ํ•„์ˆ˜ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ์ž…๋‹ˆ๋‹ค.

์–ด๋””์—?

๋‚ด ์ด์ „ ๋‹ต๋ณ€์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ์ ˆ๋ฐ˜๋งŒ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ œ์•ˆํ•œ ๋Œ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •์˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •: ๋ชจ๋“  nullable ์ž…๋ ฅ ๋˜๋Š” ๋ฐ˜ํ™˜๋œ ๊ฐ’์€ X ๋Œ€์‹  Nullable<X> ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

null ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์— null ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž, ์ด ์‚ฌ์‹ค์€ ์ด์ œ _๋ฌธ์„œํ™”__(์ด๋ฏธ JSDoc ์ฃผ์„ ๋˜๋Š” ๋ฌด์—‡์ด๋“  ํ•  ์ˆ˜ ์žˆ์Œ)ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ํƒ€์ž„์— _์ ์šฉ_๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ: declare find<T>(list: T[], predicate: (T) => bool) . ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชจ๋‘ null์ด ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( Nullable ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ). ์•„์ง find(null, null) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜๋Š” ์„ ์–ธ์—์„œ ์ˆ ์–ด์—์„œ null์ด ์•„๋‹Œ bool ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์ง€๋งŒ find([], () => null) ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Nullable ์œ ํ˜•์€ ๊ฐœ๋ฐœ์ž๊ฐ€ let x: number = null; x.toString()

๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. linter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ null ํ‚ค์›Œ๋“œ๋ฅผ ๊ธˆ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ๋Œ€์‹  nothing ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์ œ๊ฐ€ ์„ ๋ก€์— ๋‚˜์—ดํ•œ ๊ฒฝ์šฐ์— ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‚ด ๊ด€์ ์—์„œ ์ด๊ฒƒ์€ 95%๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋งŽ์€ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ๊ตฌ๋ฌธ์ด ํ›จ์”ฌ ๋” ๋‚˜๋น ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ณ  nullable์ด ์•„๋‹Œ ์œ ํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์›ํ•˜๋Š” ๋ชจ๋“  ์ •์  ์•ˆ์ „์„ฑ์ด ์—ฌ์ „ํžˆ ์—†์Šต๋‹ˆ๋‹ค.

null์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ชจ๋“  ๊ฐ’์„ ์‚ญ์ œํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋งํ•˜๋Š” nullable์ด ์•„๋‹Œ ๊ฐ€์ƒ์˜ ์œ ํ˜•์œผ๋กœ ์–ด์จŒ๋“  ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋™์ผํ•œ ์ข…๋ฅ˜์˜ ๋ถ„๋ฆฌ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ •์˜ ํŒŒ์ผ์„ ๊ฒ€ํ† ํ•˜๊ณ  ์ ์ ˆํ•œ ์œ„์น˜์— ! ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

์žŠ์–ด๋ฒ„๋ฆฌ๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๊ฒƒ. ๊ฐ™์€ ๊ฒƒ.

ํ•ดํ‚น์ด ์‹ค์ œ๋กœ ๋‹น์‹ ์„ ๋ฉ€๋ฆฌ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

toString from Object ๊ฐ€ ์žˆ๋Š” Nothing ์„ ์ •์˜ํ•œ ๋ฐฉ์‹์€ ์˜ณ์•˜์ง€๋งŒ.. @Arnavion ( Nothing void ์‚ฌ์šฉ)์˜ ์•„์ด๋””์–ด๋ฅผ ์ทจํ•œ๋‹ค๋ฉด Nothing ) ๊ฐ‘์ž๊ธฐ ํด๋ฆญ

๋ณด๋‹ค

image

๋‚ด ๊ด€์ ์—์„œ ์ด๊ฒƒ์€ 95%๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋งŽ์€ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ๊ตฌ๋ฌธ์ด ํ›จ์”ฌ ๋” ๋‚˜๋น ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ณ  nullable์ด ์•„๋‹Œ ์œ ํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์›ํ•˜๋Š” ๋ชจ๋“  ์ •์  ์•ˆ์ „์„ฑ์ด ์—ฌ์ „ํžˆ ์—†์Šต๋‹ˆ๋‹ค.

์ด ํŒจํ„ด์€ ๋‹น์‹ ์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ์•ž์œผ๋กœ๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. null์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์‹ค์ œ ์œ ํ˜•์„ ๊ณ„์† ์š”์ฒญํ•˜์„ธ์š”. ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ง๋„ ์•ˆ๋˜๋Š” ์†Œ๋ฆฌ๋กœ ๊ท€์ฐฎ๊ฒŒ ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

@aleksey-bykov
๋‚˜๋Š” ๋‹น์‹ ์ด ๋ฌด์—‡์„ ํ•˜๋ ค๊ณ  ํ•˜๋Š”์ง€ ์•Œ์ง€๋งŒ, ๋‹น์‹ ์€ ์•„์ง ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ์ •๋ฆฌํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ตฌ๋ฉ์„ ์ง€์ ํ•  ๋•Œ ( null ์˜ ๋Œ€์ฒด์™€ ๊ฐ™์ด) ๊ธธ์„ ๋”ฐ๋ผ ์†”๋ฃจ์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค void ๋กœ).

๊ฒฐ๊ตญ _์–ด์ฉŒ๋ฉด_ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. nullable ํ˜•์‹์— ๋Œ€ํ•ด ๋ณต์žกํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์—์„œ null ์†Œ์Šค๋ฅผ linter๋กœ ๊ธˆ์ง€ํ•˜์—ฌ ๊ฒฐ๊ตญ nullable ํ˜•์‹์„ null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋น„ํ‘œ์ค€ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์„ค๋“ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋‚ด์žฅ null ์œ ํ˜•์„ ํ”ผํ•˜๊ณ  ์›ํ•˜๋Š” ๊ฒ€์‚ฌ๋ฅผ Nothing ์œ ํ˜•์— ์ฒจ๋ถ€ํ•˜๋„๋ก ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋น„ํ‹€๋Š” ๋ฐ ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์–ธ์–ด๊ฐ€ ์ง€์›ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์–ธ์–ด๋Š” (๋‚ด๋ถ€์ ์œผ๋กœ) ์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์œ„์— ๋ฉ‹์ง„ ๊ตฌ๋ฌธ, ๊ฐ€์žฅ์ž๋ฆฌ ์ผ€์ด์Šค ์ •๋ฆฌ, ์™ธ๋ถ€ ๋ฆฐํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ™•์‹คํžˆ ํƒ€์‚ฌ ์ •์˜์—์„œ ๋” ๋‚˜์€ ์ฑ„ํƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋” ๋ง์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด ์‹œ์ ์—์„œ ์–ธ์–ด๊ฐ€ ์ง€์›ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‚ด ์ƒ๊ฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ด…์‹œ๋‹ค. ๋‚ด์ผ TypeScript์— nullable์ด ์•„๋‹Œ ์œ ํ˜•์ด ์žˆ๋Š” ์„ธ์ƒ์—์„œ ๊นจ์–ด๋‚˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ์ƒ๊ฐ์€ ๋งค์ผ ๋ฐค ์ž ์ž๋ฆฌ์— ๋“ ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ๋‚  ๊ทธ๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ณ  ๋‚˜๋Š” ์ขŒ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜๋Š” ์ง์žฅ์— ๊ฐ€์„œ ์ตœ๊ทผ์— ๋‚ด ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์„ ์ฐพ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์„ ๋•Œ๊นŒ์ง€ null๋กœ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. TypeScript์—์„œ nullable์ด ์•„๋‹ˆ์—ˆ์œผ๋ฉด ํ•˜๋Š” ๋ฐ”๋žจ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌผ๋ก  ๋‚ด๊ฐ€ ํ•˜๋Š” ์ผ. ๋‚˜๋Š” ๊ทธ๋“ค๊ณผ ์ขŒ์ ˆ ์—†์ด ์‚ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

TypeScript์—์„œ nullable์ด ์•„๋‹ˆ์—ˆ์œผ๋ฉด ํ•˜๋Š” ๋ฐ”๋žจ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌผ๋ก  ๋‚ด๊ฐ€ ํ•˜๋Š” ์ผ.

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? : ์Šค๋งˆ์ผ :

๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์„ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ€์ด์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ์ˆ˜์—…์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ์€ ๊ฒƒ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ท€ํ•˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์–ธ์  ๊ฐ€๋Š” TS๊ฐ€ ์ ์ ˆํ•œ ์ง€์›์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. C# ํŒ€์€ ํ˜„์žฌ ๋™์ผํ•œ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ์„ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. C# 7์ด null์ด ์•„๋‹Œ ์œ ํ˜•์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด(์•„์ง ํ™•์‹คํ•˜์ง€ ์•Š์Œ) TS๊ฐ€ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@aleksey-bykov

๊ทธ๋ž˜์„œ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด

var nothing: void = null;
function isNothing<a>(value: a | void): value is void {
    return value == null;
}
var something = Math.random() > 0.5 ? 'hey!' : nothing;

์ด์ œ ํ•จ์ˆ˜ ๋ž˜ํผ ์—†์ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์œ ํ˜• ์ •์˜๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ ์€ ๊ธฐ๋ณธ ์ ์œผ๋กœ ๊ทธ๊ฒƒ ์— ์˜์กด ํ•˜๋Š” ๊ฒƒ์„ ๋‚™๋‹ด ํ•  ๋•Œ๊นŒ์ง€ ๋‚˜๋ฅผ ์•ฝ๊ฐ„ ํ–‰๋ณตํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ž…๋‹ˆ๋‹ค .

๋ชจ๋“  ์ •์˜ ํŒŒ์ผ์„ ๊ฒ€ํ† ํ•˜๊ณ  ! ์ ์ ˆํ•œ ๊ฒฝ์šฐ. ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

ํ•ต ๋Œ€์‹  ํ‘œ์ค€ ๊ณต์‹ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ(DefinitelyTyped)๊ฐ€ ํ”„๋กœ์ ํŠธ ์œ„์— ์Œ“์ด๋Š” ๋ชจ๋“  ์ถ”๊ฐ€ ์ž‘์—… ๋Œ€์‹  ์ •์˜ ํŒŒ์ผ์„ ์ž‘์„ฑ, ํ…Œ์ŠคํŠธ ๋ฐ ๊ณต์œ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. :์›ƒ๋‹ค:).

์ €๋Š” " --noImplicitNull "๋ฅผ ์˜นํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์œ ํ˜•์ด nullable์ด ์•„๋‹Œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •๋˜์–ด ๊ธฐ์กด ์ฝ”๋“œ์˜ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ฆ‰์‹œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. "!"๊ฐ€ ์žˆ์œผ๋ฉด typechecker๊ฐ€ null ๊ฐ€๋Šฅ์„ฑ(nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์บ์ŠคํŠธ)์„ ๋ฌด์‹œํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด Swift์ฒ˜๋Ÿผ ํ–‰๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก ๊ทธ๊ฒƒ์ด ์•ฝ์†์— ๋Œ€ํ•œ ES7+ "์ตœ์ข… ๋ณด๋‚ด๊ธฐ" ์—ฐ์‚ฐ์ž ์™€ ์ถฉ๋Œํ•˜๋ฏ€๋กœ ์ตœ์„ ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด.

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ์†์ƒ์ด๋ผ๋Š” ์ธก๋ฉด์—์„œ ๋„ˆ๋ฌด ๊ธ‰์ง„์ ์œผ๋กœ ๋ณด์ธ๋‹ค๋ฉด ๊ทธ๊ฑด ์ •๋ง ๋‚ด ์ž˜๋ชป์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ •๋ง๋กœ ์‹œ๊ฐ„์„ ์ฐพ๊ณ  ํฌํฌ์—์„œ ์‹œ๋„ํ•˜์—ฌ ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ธ‰์ง„์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ถ”๊ฐ€ "!" ๋” ๊ธ‰์ง„์ ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ’์ด ์‹ค์ œ๋กœ null์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ™œ์šฉํ•˜๋ ค๋ฉด ๋” ๋งŽ์€ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. --noImplicitNull ๋Š” null์ด ์•„๋‹Œ ๊ฐ’์„ ์ž˜๋ชป ์ฃผ์žฅํ•˜๋Š” ์œ ํ˜• ์ •์˜๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋” ๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์ˆ˜์ • ์—†์ด๋Š” null ํ• ๋‹น, ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฐ’ ๋ฐ ์„ ํƒ์  ๊ฐœ์ฒด ํ•„๋“œ์— ๋Œ€ํ•œ ์žŠ์–ด๋ฒ„๋ฆฐ ๊ฒ€์‚ฌ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋™์ผํ•œ ๋™์ž‘์„ ์–ป๊ฒŒ ๋˜๋ฏ€๋กœ ๋” ์ ์ง„์ ์ž…๋‹ˆ๋‹ค. .

ํ† ๋ก ์— ๋‚ด ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋”ํ•˜๋ฉด Kotlin์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

  • ์ž์ฒด ๋ณ€์ˆ˜์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ '?' ๋ณ€๊ฒฝ
  • ์™ธ๋ถ€ ๋ณ€์ˆ˜๋Š” '!!' ์žฌ์ •์˜
  • null ๊ฒ€์‚ฌ๋Š” ์œ ํ˜• ์บ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
  • ์ฃผ์„์„ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ๋กœ ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๊ตํ•˜๋‹ค:
1
2

  • ๊ฒฝ์šฐ a|void ํ•˜๋‚˜๊ฐ€๋กœ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๊ธˆ์ง€ a|Nothing

ํ•ต ๋Œ€์‹  ํ‘œ์ค€ ๊ณต์‹ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ(DefinitelyTyped)๊ฐ€ ์ •์˜ ํŒŒ์ผ์„ ์ž‘์„ฑ, ํ…Œ์ŠคํŠธ ๋ฐ ๊ณต์œ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • 100% ํ•ฉ๋ฒ•์ ์ธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ดํ‚น์ธ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ธฐ์ˆ ์„ ๊ณผ๋Œ€ํ‰๊ฐ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋งŽ์€(๋Œ€๋ถ€๋ถ„์€ ์•„๋‹ˆ์ง€๋งŒ) ์ •์˜์˜ ํ’ˆ์งˆ์ด ๋‚ฎ๊ณ  jquery์™€ ๊ฐ™์€ ์ •์˜๋„ ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ ์—†์ด ์ž‘์„ฑ๋œ ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ํŒจํ„ด์€ ์™„์ „ํ•œ ๊ธฐ๋Šฅ๋งŒํผ ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ดํ•ดํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํŒจํ„ด์€ ์˜ค๋Š˜๋‚  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋Šฅ์€ ๊ทผ์ฒ˜์— ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒํ™ฉ์ด AB์™€ C๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ(์ตœ๋Œ€ 95%) ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™œ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ D๊ฐ€ ํ•„์š”ํ• ๊นŒ์š”? ์•ฝ๊ฐ„์˜ ์„คํƒ•์„ ๊ฐˆ๋ง? ํŒจํ„ด์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ผ์— ์ง‘์ค‘ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์–ด์จŒ๋“  ๋ฌธ์ œ ํ•ด๊ฒฐ์‚ฌ์™€ ์™„๋ฒฝ์ฃผ์˜์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋งŒ์•ฝ ๋‹น์‹ ์ด void ํƒ€์ž…์— ์˜์กดํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด, Nothing ๋„ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ผ class Nothing { private toString: any; /* other Object.prototype members */ } ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #1108 ์ฐธ์กฐ)

_์ฐธ๊ณ : ์—ฌ๊ธฐ์—์„œ๋Š” ๊ตฌ๋ฌธ์„ ๋ฐ”์ดํฌ์‰๋”ฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ›์ง€๋งˆ์„ธ์š”
๊ทธ๋Œ€๋กœ._

๊ฐ„๋‹จํžˆ ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ TS 1.6 ์†”๋ฃจ์…˜์˜ ๋ฌธ์ œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ: ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š”
๋Œ€๋ถ€๋ถ„์˜ ์ •์˜ ํŒŒ์ผ. ์ˆ˜ํ•™ ์—ฐ์‚ฐ์ž์—๋„ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„ค๊ฐ€ ์›ํ•œ๋‹ค๋ฉด
์ค‘๋ณต ์œ ํ˜•/๋Ÿฐํƒ€์ž„ ์ƒ์šฉ๊ตฌ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๋ ค๋ฉด ์ œ๋„ค๋ฆญ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.
์ปฌ๋ ‰์…˜์€ C ++์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋น„๊ตํ•˜๋ฉด ์ฐฝ๋ฐฑํ•ฉ๋‹ˆ๋‹ค.
๋ฐฐ์—ด์ด ์•„๋‹Œ ๊ฒŒ์œผ๋ฅธ ๋ฐ˜๋ณต ๋˜๋Š” ์ปฌ๋ ‰์…˜(๋˜๋Š” ๋” ๋‚˜์˜๊ฒŒ๋Š”
๋‘˜์„ ๊ฒฐํ•ฉ).

@aleksey-bykov๊ฐ€ ํ˜„์žฌ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์˜ ๋ฌธ์ œ๋Š”
์–ธ์–ด ์ฝ”์–ด์—์„œ๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹น์‹ ์€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค
Object.defineProperty(null, "name", desc) - ๋‹ค์Œ์—์„œ TypeError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
null ๋Œ€์ƒ ๊ฐœ์ฒด. ๋˜ ๋‹ค๋ฅธ ์‚ฌํ•ญ: ์†์„ฑ์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
null ์—์„œ ๊ฐ™์€ ๊ฐ์ฒด, var o = null; o.foo = 'foo'; . ๋‹น์‹ ์€ ์–ป์„ ๊ฒƒ์ด๋‹ค
์ฐธ์กฐ ์˜ค๋ฅ˜ IIRC. ์ด ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์€ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ์–ธ์–ด ์ง€์›์ด ํ•„์š”ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.


_์ด์ œ, ์•ฝ๊ฐ„์˜ ๊ฐ€๋ฒผ์šด ์ž์ „๊ฑฐ ์ด๋™..._

๊ทธ๋ฆฌ๊ณ  ๊ตฌ๋ฌธ์— ๊ด€ํ•ด์„œ๋Š” "?string"์˜ ๊ฐ„๊ฒฐํ•จ๊ณผ
"!string" ๊ตฌ๋ฌธ์ด์ง€๋งŒ ์ตœ์ข… ๊ฒฐ๊ณผ์— ๊ด€ํ•œ ํ•œ ๋‚˜๋Š” ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ThisIsANullableType<T, U, SomeRidiculousAndUnnecessaryExtraGeneric<V, W>> ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2015๋…„ 7์›” 29์ผ ์ˆ˜์š”์ผ 16:10 Aleksey Bykov ์•Œ๋ฆผ @github.com์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

  • |void๊ฐ€ ๊ธˆ์ง€๋œ ๊ฒฝ์šฐ|์•„๋ฌด๊ฒƒ๋„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ‘œ์ค€ ๊ณต์‹ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ฃผ์š” ์ฐจ์ด์ 
    ํ•ดํ‚น ๋Œ€์‹  ์ปค๋ฎค๋‹ˆํ‹ฐ(DefinitelyTyped)๊ฐ€ ๋„์›€์„ ์ฃผ๊ธฐ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
    ์ •์˜ ํŒŒ์ผ ์ž‘์„ฑ, ํ…Œ์ŠคํŠธ ๋ฐ ๊ณต์œ 

    100% ํ•ฉ๋ฒ•์ ์ธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ดํ‚น์ธ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ธฐ์ˆ ์„ ๊ณผ๋Œ€ํ‰๊ฐ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค(๋Œ€๋ถ€๋ถ„์€ ์•„๋‹ˆ์ง€๋งŒ).
    ํ’ˆ์งˆ์ด ๋‚ฎ๊ณ  jquery์™€ ๊ฐ™์€ ์ •์˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ข…์ข… ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ ์—†์ด ์ž‘์„ฑ๋œ ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ํŒจํ„ด์€ ์™„์ „ํ•œ ๊ธฐ๋Šฅ๋งŒํผ ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

    ํŒจํ„ด์€ ์˜ค๋Š˜๋‚  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋Šฅ์€

    ๊ฐ€๊นŒ์ด์— ์žˆ์ง€ ์•Š๋‹ค

    AB๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ™ฉ์„ ํšจ์œจ์ ์œผ๋กœ(์ตœ๋Œ€ 95%) ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
    ๊ทธ๋ฆฌ๊ณ  C ์™œ ๋ˆ„๊ตฐ๊ฐ€ D๊ฐ€ ๊ฐ™์€ ์ผ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•ฝ๊ฐ„์˜ ์„คํƒ•์„ ๊ฐˆ๋ง? ์™œ ๊ทธ๋Ÿด๊นŒ
    ํŒจํ„ด์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๊นŒ?

์–ด์จŒ๋“  ๋ฌธ์ œ ํ•ด๊ฒฐ์‚ฌ์™€ ์™„๋ฒฝ์ฃผ์˜์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -126082053
.

๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ƒ‰์œผ๋กœ ์น ํ• ์ง€ ๊ณ ๋ฏผํ•˜๊ธฐ ์ „์— ์ž์ „๊ฑฐ ์ฐฝ๊ณ  ๊ตฌ์กฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ์ ์–ด๋„ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ฒ˜์Œ ~10๊ฐœ์˜ ๋Œ“๊ธ€ ์ดํ›„์— ์ œ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ๊ฒƒ์˜ ๋Œ€๋ถ€๋ถ„์€ "์ด๋ด, ์šฐ๋ฆฌ๋Š” ์ž์ „๊ฑฐ ๋ณด๊ด€์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์–ด! ๋ฌด์Šจ ์ƒ‰์œผ๋กœ ์น ํ• ๊นŒ?" ๋””์ž์ธ์ด ๊ตฌ์กฐ์ ์œผ๋กœ ๊ฑด์ „ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ด์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์˜ˆ๋Š” #3192์™€ #1206์˜ ์ „๋ฐ˜๋ถ€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋‚ด๊ฐ€ ๋งˆ์นจ๋‚ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ตฌ๋ฌธ๊ณผ ์™„์ „ํžˆ ์ง€์ •๋œ ์˜๋ฏธ๋ก ์œผ๋กœ ์ง„์ง€ํ•œ ์ œ์•ˆ์„ ํ–ˆ์„ ๋•Œ ๋Œ€๋ถ€๋ถ„์˜ ๋…ธ์ด์ฆˆ๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.)

๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค: ์ด๊ฒƒ์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜• ์ •์˜์˜ ์ฃผ์š” ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐ ๋ถ€๋ถ„ ์žฌ์ž‘์„ฑ์„ ์ดˆ๋ž˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฅผ ์ง€์›ํ•˜๋Š” TS์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์— ๋Œ€ํ•ด ์žฌ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” DefinedTyped์˜ ์œ ํ˜• ์ •์˜ ๋Œ€๋ถ€๋ถ„์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ๊นจ์งˆ ๊ฒƒ์ž„์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. (ํ•ด๊ฒฐ์ฑ…์€ null ๊ด€๋ จ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ญ์ƒ ๋ฐœ์ƒํ•˜์ง€๋งŒ ํ•ด๋‹น ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด --noImplicitAny ํ”Œ๋ž˜๊ทธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๋ถ„๋ช…ํžˆ ๋‚˜๋Š” โ€‹โ€‹์—ฌ๊ธฐ์—์„œ ์•ฝ๊ฐ„ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” "nullable javascript" ๋ฐ "nullability javascript"์— ๋Œ€ํ•ด studer.google์„ ๊ฒ€์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
TypeScript ์ดํ•ดํ•˜๊ธฐ
TypeScript(๋ชจ๋“ˆ ์ œ๋„ค๋ฆญ)์— ๋ฉ‹์ง„ ์œ ํ˜• ํ…Œ์ด๋ธ”์ด ์žˆ์Šต๋‹ˆ๋‹ค.

JavaScript์˜ ์ข…์† ์œ ํ˜•
์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค

์‹ ๋ขฐํ•˜๋˜ ํ™•์ธ: ๋™์ ์„ ์œ„ํ•œ 2๋‹จ๊ณ„ ์ž…๋ ฅ์–ธ์–ด
์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด์˜ ๊ตฌ์ฒดํ™” ์œ ํ˜•
typescript ๊ธฐ๋ฐ˜์˜ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
("์•ฝ์นญ t?๋Š” t + null์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค." ; #186์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค)

@afrische ์ด๊ฒƒ์˜ ๋Œ€๋ถ€๋ถ„์€ ์ด๋ฏธ JS ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Flow๋Š” "Trust, but Verify"์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ด€์šฉ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Infernu ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. WIP JS ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ๋Š” ์ฃผ๋กœ Hindley-Milner ์œ ํ˜• ์ถ”๋ก  1 ์— ์˜์กดํ•˜์—ฌ ์œ ํ˜•์„ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚œ ํƒˆ๋‹น...

[1] Haskell, OCaml ๋“ฑ๋„ ํ•ด๋‹น ์œ ํ˜• ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์ˆ˜์ •๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ํ˜„์žฌ ์œ ํ˜•์ด ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  null ์™€ ๊ฐ™์ด (๊ธฐ์กด) Null ์œ ํ˜•์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” TS ํฌํฌ๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: string | null . ๋˜ํ•œ ๋™์ผํ•œ ๊ณต์šฉ์ฒด ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ์ธ string? ๋Œ€ํ•œ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณฐ๊ณฐ์ด ์ƒ๊ฐํ•ด๋ณด๋ฉด @aleksey-bykov์™€ ๊ฐ™์ง€๋งŒ null ๋Š” Nothing ํ˜•์‹์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์ด๋ฏธ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ณต์žกํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค!

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋ถ„์€ ๋ถ€๋“œ๋Ÿฌ์šด ์ „ํ™˜ ๊ฒฝ๋กœ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ธฐ์กด ์ •์˜ ํŒŒ์ผ๊ณผ _์ ์–ด๋„_ ์ผ๋ถ€ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(ํ”„๋กœ์ ํŠธ ์ž์ฒด์™€์˜ ํ˜ธํ™˜์„ฑ์€ ์˜ตํŠธ์ธ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธํ„ฐ๋„ท์—์„œ์™€ ๊ฐ™์ด ์ฝ”๋“œ ์กฐ๊ฐ์˜ ์˜๋ฏธ๊ฐ€ t ์ „์—ญ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„).

์‚ฌ์šฉ @afrische์˜ ์•„์ด๋””์–ด string? ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ์— ์žˆ์ง€๋งŒ ์‚ฌ์šฉํ•˜์—ฌ string! ์—์„œ .d.ts ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋ก ๊ทธ๊ฒƒ์ด ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ž์˜์ ์ธ ์ด์ค‘์„ฑ์„ ๋ณ„๋กœ ์ข‹์•„ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ. string null์„ ํ—ˆ์šฉํ•˜๊ณ  ์ผ๋ถ€ ํŒŒ์ผ์€ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด์ƒํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

์ผ๋ถ€ ํŒŒ์ผ์—์„œ๋Š” ๋ฌธ์ž์—ด์„ null ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ.
์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ตํŠธ์•„์›ƒ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๊ณ  ์ด๋ฅผ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ๋„์ž…ํ•˜๋Š” @impinball ์˜ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์—

์ด ์Šค๋ ˆ๋“œ๋Š” 1๋…„์ด ๋„˜์—ˆ๊ณ  ๊ฑฐ์˜ 300๊ฐœ์˜ ๋Œ“๊ธ€๊ณผ TS ํŒ€ ์ž์ฒด์˜ ์†Œ์ˆ˜์— ๋ถˆ๊ณผํ•˜์—ฌ ๋ชจ๋“  ๊ด€๋ จ ๋””์ž์ธ๊ณผ ์šฐ๋ ค ์‚ฌํ•ญ์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ Flow, Closure Compiler ๋˜๋Š” TypeScript๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๊ณ„ํš์ด์ง€๋งŒ TypeScript์— null ์•ˆ์ „์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ •๋ง ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์ง€ ์•Š๊ณ ๋Š” ! ๋ฐ ? null ํ—ˆ์šฉ ์—ฌ๋ถ€ ์ง€์ •์ž๋ฅผ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•˜๋Š” ๋™์‹œ์— ์ด๋“ค์ด ๋ถ€์กฑํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ธฐ์กด ๋™์ž‘์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ž˜๋ชป๋œ ์ ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

์ œ์•ˆ

declare var foo:string // nullability unspecified
declare var foo:?string // nullable
declare var foo:!string // non-nullable

ํ•จ๊ป˜ ?string ์˜ ์ˆ˜ํผ !string ๋ฐ string ์ˆ˜ํผ ๋‘˜ ๋ชจ๋‘์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ, ์ฆ‰ ๊ด€๊ณ„ string ๋ชจ๋‘ ?string !string ๋Š” any ์™€ ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜• ๊ฐ„์˜ ๊ด€๊ณ„์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ! ๋˜๋Š” ? ๊ฐ€ ์—†๋Š” ๋ฒ ์–ด ์œ ํ˜•์€ any ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

| ์œ ํ˜• | ํฌํ•จ | ์ œ๊ณต | null ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? | null ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? |
| --- | --- | --- | --- | --- |
| T | T , !T , ?T | T , ?T , !T | ๋„ค | ๋„ค |
| ?T | T , !T , ?T | T , ?T | ๋„ค | ์•„๋‹ˆ์˜ค(ํƒ€์ž… ๊ฐ€๋“œ ํ•„์š”) |
| !T | T , !T | T , ?T , !T | ์•„๋‹ˆ | ๋„ค |

์ด๊ฒƒ์€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  null ์•ˆ์ „์„ ์ œ๊ณตํ•˜๊ณ  any ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์œ ํ˜• ์•ˆ์ „์„ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ ์ง„์ ์œผ๋กœ null ์•ˆ์ „์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

๋‹ค์Œ์€ null ์ฐธ์กฐ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ผ๋ถ€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

function test(foo:Foo) { foo.method(); }
test(null);

์ด ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. null ๋Š” ์—ฌ์ „ํžˆ Foo ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ  Foo ๋Š” ์—ฌ์ „ํžˆ null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function test(foo:!Foo) { foo.method(); }
test(null);

null ๋Š” !Foo ํ• ๋‹นํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ test(null) ๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

function test(foo:?Foo) { foo.method(); }
test(null);

์ด์ œ foo.bar() ์— ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์ดํ›„์— ์˜ค๋ฅ˜๊ฐ€ ?Foo ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ฆ‰ ์ฝ”๋“œ๊ฐ€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค null ).

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ด ์•„์ด๋””์–ด๊ฐ€ ์ •๋ง ์ข‹์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด
?T ๋ฐ T Array<T> ๋ฐ T[] ์™€ ๊ฐ™์€ ๋ณ„์นญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ
์ผ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์žฅ์‹๋˜์ง€ ์•Š์€ ๋ฒ„์ „์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ธฐ์ˆ ์ ์œผ๋กœ
๋„ ์ž…๋ ฅ ๊ฐ€๋Šฅ.

2015๋…„ 8์›” 28์ผ ๊ธˆ์š”์ผ 07:14 Jesse Schalken [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋Š” 1๋…„์ด ๋„˜์—ˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
๊ด€๋ จ ๋””์ž์ธ๊ณผ ์šฐ๋ ค ์‚ฌํ•ญ์€ ๊ฑฐ์˜ 300๊ฐœ์— ๋‹ฌํ•˜๋Š” ๋Œ“๊ธ€๊ณผ ์†Œ์ˆ˜์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.
TS ํŒ€ ์ž์ฒด์—์„œ.

๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ Flow, Closure Compiler ๋˜๋Š”
TypeScript ๊ทธ๋Ÿฌ๋‚˜ TypeScript์˜ ์œ ํ˜• ์•ˆ์ „ ๋ถ€์กฑ์€ ์‹ค์ œ ๊ฑฐ๋ž˜ ์ฐจ๋‹จ๊ธฐ์ž…๋‹ˆ๋‹ค.

์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์ง€ ์•Š๊ณ  ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ์ž˜ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋‘˜ ๋‹ค ์ถ”๊ฐ€ํ•˜๋ฉด ! ๊ทธ๋ฆฌ๊ณ  ? ์œ ์ง€ํ•˜๋ฉด์„œ null ํ—ˆ์šฉ ์—ฌ๋ถ€ ์ง€์ •์ž
๊ทธ๊ฒƒ๋“ค์ด ์—†๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ๊ธฐ์กด ๋™์ž‘, ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์— ์ œ์•ˆ์ž…๋‹ˆ๋‹ค:
์ œ์•ˆ

์„ ์–ธ var foo:string // null ํ—ˆ์šฉ ์—ฌ๋ถ€ ์ง€์ •๋˜์ง€ ์•Š์Œdeclare var

?string์„ ์‚ฌ์šฉํ•˜์—ฌ !string์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์„, ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์œ„ ์ง‘ํ•ฉ๊ณผ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๋ชจ๋‘
๋‘˜ ๋‹ค, ์ฆ‰ string๊ณผ ?string ๋ฐ !string ๋ชจ๋‘์˜ ๊ด€๊ณ„
๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜• ๊ฐ„์˜ ๊ด€๊ณ„์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰,
์—†๋Š” ๋ฒ ์–ด ํƒ€์ž…! ๋˜๋Š” ? ๋ฌดํšจํ™”์™€ ๊ด€๋ จํ•˜์—ฌ ๋ชจ๋“  ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
์œ ํ˜• ํฌํ•จ ์ œ๊ณต null์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? null์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ใ…œ, ! , ? ,
?T, !T ์˜ˆ ์˜ˆ ?TT, !T, ?TT, ?T ์˜ˆ ์•„๋‹ˆ์š”(์œ ํ˜• ๊ฐ€๋“œ ํ•„์š”) !TT, !TT,
?T, !T ์•„๋‹ˆ์š” ์˜ˆ

์ด๊ฒƒ์€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  null ์•ˆ์ „์„ ์ œ๊ณตํ•˜๊ณ 
๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ ์ง„์ ์œผ๋กœ null ์•ˆ์ „์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ์‹œ

๋‹ค์Œ์€ null ์ฐธ์กฐ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ผ๋ถ€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ(foo:Foo) { foo.method(); } ํ…Œ์ŠคํŠธ(๋„);

์ด ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. null์€ ์—ฌ์ „ํžˆ โ€‹โ€‹Foo์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ  Foo๋Š” ์—ฌ์ „ํžˆ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ(foo:!Foo) { foo.method(); } ํ…Œ์ŠคํŠธ(๋„);

์ด์ œ !Foo์— null์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— test(null)์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ(foo:?Foo) { foo.method(); } ํ…Œ์ŠคํŠธ(๋„);

์ด์ œ foo.bar()์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ?Foo์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
(์ฆ‰, ์ฝ”๋“œ๋Š” null์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -135743011
.

@impinball

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ด ์•„์ด๋””์–ด๊ฐ€ ์ •๋ง ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด Array<T> ๋ฐ T[] ์™€ ๊ฐ™์ด Array<T> ?T ๋ฐ T ๋ฅผ ๋ณ„์นญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์ผ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์žฅ์‹๋˜์ง€ ์•Š์€ ๋ฒ„์ „์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ธฐ์ˆ ์ ์œผ๋กœ nullable์ž…๋‹ˆ๋‹ค.

_์ „์ฒด ์•„์ด๋””์–ด_๋Š” T , ?T ๋ฐ !T ๊ฐ€ ์„ธ ๊ฐ€์ง€ ๋ณ„๊ฐœ์˜ ๊ฒƒ์ด๋ฉฐ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด _is_ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ธฐ์กด TS ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ). ์–ด๋–ป๊ฒŒ ๋” ์ž˜ ์„ค๋ช…ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ๋‚˜๋Š” ์ž‘์€ ํ…Œ์ด๋ธ”๊ณผ ๋ชจ๋“  ๊ฒƒ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์•„. ์ข‹์€ ์ง€์ . ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํ‘œ๋ฅผ ์ž˜๋ชป ํ•ด์„ํ•ด์„œ ๊ฐ„๊ณผํ•œ
๊ธฐ์กด ์ •์˜ ํŒŒ์ผ์ด ์ „ํ™˜๋˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.

2015๋…„ 8์›” 28์ผ ๊ธˆ์š”์ผ 11:43 Jesse Schalken [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@impinball https://github.com/impinball

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ด ์•„์ด๋””์–ด๊ฐ€ ์ •๋ง ์ข‹์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด
Array์™€ ๊ฐ™์€ ๋ณ„์นญ์œผ๋กœ T์™€ T๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?๊ทธ๋ฆฌ๊ณ  T[]? ๊ทธ๊ฒƒ์€ ๊ฒƒ
์ผ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์žฅ์‹๋˜์ง€ ์•Š์€ ๋ฒ„์ „์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ธฐ์ˆ ์ ์œผ๋กœ nullable์ž…๋‹ˆ๋‹ค.

_์ „์ฒด ์•„์ด๋””์–ด_๋Š” T, ?T ๋ฐ !T๊ฐ€ ์„ธ ๊ฐ€์ง€ ๋ณ„๊ฐœ์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด _is_์ž…๋‹ˆ๋‹ค(๊ธฐ์กด TS์™€์˜ ํ˜ธํ™˜์„ฑ
์•”ํ˜ธ). ์–ด๋–ป๊ฒŒ ๋” ์ž˜ ์„ค๋ช…ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ๋‚ด๊ฐ€ ๋งŒ๋“ 
์ž‘์€ ํ…Œ์ด๋ธ”๊ณผ ๋ชจ๋“  ๊ฒƒ.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -135810311
.

๋˜‘๋˜‘ํ•œ ๋†ˆ์ด๋ผ ๋ฏธ์•ˆํ•˜์ง€๋งŒ ์ด๊ฑด ๋ง์ด ์•ˆ ๋ผ

?string ์ƒ์œ„์˜ !string ๋ฐ string ์ˆ˜ํผ ๋‘˜ ๋ชจ๋‘์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ

์ง‘ํ•ฉ ์ด๋ก ์—์„œ ์šฐ๋ฆฌ๋Š” ์ง‘ํ•ฉ A๊ฐ€ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด๊ณ  ์ง‘ํ•ฉ B์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ด A = B์ผ ๋•Œ๋งŒ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด "๋‘˜ ๋‹ค"๋ผ๊ณ  ๋งํ•  ๋•Œ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๊ฒƒ = ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๊ฒƒ๊ณผ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๊ฒƒ = ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ถ๊ทน์ ์œผ๋กœ all-of-?string = Everything-of-!string

๋ชจ๋‘๊ฐ€ ๋‚ด๋ฆฌ๋Š” ๊ณณ์—์„œ ๋ฒ„์Šค๋Š” ์•„๋ฌด๋ฐ๋„ ๊ฐ€์ง€ ์•Š๊ณ  ๋ฒ„์Šค๋Š” ์šดํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@aleksey-bykov ์•„๋งˆ๋„ ์ž˜๋ชป๋œ ํ‘œํ˜„์˜ ๊ฒฝ์šฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฐ€ string ๊ฐ€ ?string | !string ๊ฐ€์žฅ ๊ด€๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ทจํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์€ ์ ์  ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Java์˜ @Nullable ๋ฐ @NonNull / @NotNull ์ปดํŒŒ์ผ ํƒ€์ž„ ์œ ํ˜• ์ฃผ์„๊ณผ ์ฃผ์„์ด ์—†๋Š” ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋ฒ”์œ„๊ฐ€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•”์‹œ์ ์œผ๋กœ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ์œ ํ˜•, ํŠนํžˆ ๊ธฐ๋ณธ ํ˜•์‹์— ๋Œ€ํ•œ ์ƒˆ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

"๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด ์•„๋‹˜" ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ๋งŽ์€ ํ™•์‹คํžˆ Typed ์ •์˜๊ฐ€ ์†์ƒ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” Angular ๋ฐ Node์˜ ์ •์˜๊ฐ€ ํฌํ•จ๋˜๋ฉฐ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์ง€๋ฃจํ•œ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐฑํฌํŠธ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ƒˆ ์œ ํ˜•์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋˜์ง€ ์•Š์ง€๋งŒ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋Š” ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฑํฌํŠธ๋Š” ํŠนํžˆ nullable ํ˜•์‹์— ๋Œ€ํ•œ ์ •์˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ๋กœ ์†์ƒ์„ ์™„ํ™”ํ•˜๋Š” ์œ ์ผํ•œ ์‹ค์šฉ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. (์‚ฌ๋žŒ๋“ค์€ ๊ฐœ๋ฐœ, ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ์ „ํžˆ TypeScript 1.4๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)

@impinball

์‚ฌ๋žŒ๋“ค์€ ๊ฐœ๋ฐœ, ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ์ „ํžˆ TypeScript 1.4๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ˜ธํ™˜์„ฑ ์ด์•ผ๊ธฐ๋Š” ์ƒˆ ์ •์˜๋ฅผ ์ด์ „ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํ˜ธํ™˜๋˜๋„๋ก ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(FWIW๊ฐ€ ์•„๋‹Œ null ์œ ํ˜•์€ ํ˜„์žฌ TS ์ปดํŒŒ์ผ๋Ÿฌ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค).

์‚ฌ๋žŒ๋“ค์ด ์ด์ „ TS๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด์ „ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์šฉ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).
์–ด์จŒ๋“  ์ผ์ด ๊นจ์งˆ ๊ฑฐ๋ž€ ๋ง์ด์•ผ. ๊ณง TS 1.6์€ ๊ต์ฐจ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ •์˜๋„ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

BTW ์‚ฌ๋žŒ๋“ค์ด 1.4์— ๋จธ๋ฌด๋ฅด๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. 1.5์—๋Š” ์‚ฌ๋ž‘ํ•ด์•ผ ํ•  ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

@aleksey-bykov

๋˜‘๋˜‘ํ•œ ๋†ˆ์ด๋ผ ๋ฏธ์•ˆํ•˜์ง€๋งŒ ์ด๊ฑด ๋ง์ด ์•ˆ ๋ผ

๋‚˜๋Š” ๋‹น์‹ ์ด ํฌ์ŠคํŠธ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ "๋‘ ๊ฐ€์ง€์˜ ์ƒ์œ„ ์ง‘ํ•ฉ๊ณผ ํ•˜์œ„ ์ง‘ํ•ฉ"์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šค์Šค๋กœ๋ฅผ "๋˜‘๋˜‘ํ•œ ์—‰๋ฉ์ด"๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์‹ค์ œ ์„ธํŠธ์— ์ ์šฉํ•˜๋ฉด ๋ง๋„ ์•ˆ ๋œ๋‹ค.

any ๋Š” ๋ชจ๋“  ์œ ํ˜•์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ (๋ชจ๋“  ์œ ํ˜•์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์œผ๋กœ ์ž‘๋™) ๋ชจ๋“  ์œ ํ˜•์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค(๋ชจ๋“  ์œ ํ˜•์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์œผ๋กœ ์ž‘๋™). any ๋Š” "์ด ๊ฐ’์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ ์„ ํƒ ํ•ด์ œ"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

string ๋Š” !string ๋˜๋Š” ?string ๋‘˜ ๋‹ค์—์„œ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ(์ด๊ฒƒ์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์œผ๋กœ ์ž‘๋™ํ•จ) !string ๋ฐ ?string ๋‘˜ ๋‹ค๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. string ๋Š” "์ด ๊ฐ’์— ๋Œ€ํ•œ null ํ—ˆ์šฉ ์—ฌ๋ถ€ ๊ฒ€์‚ฌ์—์„œ ์ œ์™ธ", ์ฆ‰ ํ˜„์žฌ TS ๋™์ž‘์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@impinball

๊ทธ๋ฆฌ๊ณ  ์•”์‹œ์ ์œผ๋กœ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ์œ ํ˜•, ํŠนํžˆ ๊ธฐ๋ณธ ํ˜•์‹์— ๋Œ€ํ•œ ์ƒˆ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@RyanCavanaugh๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ธ์–ด์˜ ์˜๋ฏธ๋ฅผ ๋ฐ”๊พธ๋Š” ํ”Œ๋ž˜๊ทธ๋Š” ์œ„ํ—˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. [...] ์ฝ”๋“œ ์กฐ๊ฐ์„ ๋ณด๋Š” ์‚ฌ๋žŒ์ด ์œ ํ˜• ์‹œ์Šคํ…œ์„ "๋”ฐ๋ผ๊ฐˆ" ์ˆ˜ ์žˆ๊ณ  ๋งŒ๋“ค์–ด์ง€๋Š” ์ถ”๋ก ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด์˜ ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋งŽ์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ–๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ด๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

์œ ์ผํ•˜๊ฒŒ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ์˜ ์˜๋ฏธ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ํ˜„์žฌ noImplicitAny ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”Œ๋ž˜๊ทธ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด ์ œ์•ˆ์ด null ํ—ˆ์šฉ ์—ฌ๋ถ€ ์ง€์ •์ž๊ฐ€ ์—†๋Š” ์œ ํ˜•( ! ๋˜๋Š” ? )์— ๋Œ€ํ•œ ๊ธฐ์กด ๋™์ž‘์„ ์œ ์ง€ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•  _only_ ์•ˆ์ „ํ•œ ํ”Œ๋ž˜๊ทธ๋Š” null ํ—ˆ์šฉ ์—ฌ๋ถ€ ์ง€์ •์ž๊ฐ€ ์—†๋Š” ์œ ํ˜•์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ „๋‹ฌ ์ฝ”๋“œ๋งŒ ๊ฐ€์ ธ์™€์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์˜๋ฏธ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด์œ ๋กœ noImplicitAny ๊ฐ€ ํ—ˆ์šฉ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

@jesseschalken

์•”์‹œ์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ ๋ณ€์ˆ˜์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.
null ๋˜๋Š” undefined ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ:

var a = new Type(); // type: !Type
var b = 2; // type: !number
var c = 'string'; // type: !string
// etc...

ํ˜ผ๋ž€์„ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

2015๋…„ 8์›” 28์ผ ๊ธˆ์š”์ผ 19:54 Jesse Schalken [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@impinball https://github.com/impinball

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ํ”Œ๋ž˜๊ทธ์— ํ™•์‹คํžˆ ์ฐฌ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์•”์‹œ์ ์œผ๋กœ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ, ํŠนํžˆ ๊ธฐ๋ณธ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

@RyanCavanaugh https://github.com/RyanCavanaugh๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ธ์–ด์˜ ์˜๋ฏธ๋ฅผ ๋ฐ”๊พธ๋Š” ํ”Œ๋ž˜๊ทธ๋Š” ์œ„ํ—˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. [...]
์ฝ”๋“œ ์กฐ๊ฐ์„ ๋ณด๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด "๋”ฐ๋ผ๊ฐˆ ์ˆ˜" ์žˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
์œ ํ˜• ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋˜๋Š” ์ถ”๋ก ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ์—
์šฐ๋ฆฌ๋Š” ์–ธ์–ด์˜ ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋งŽ์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ–๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

์œ ์ผํ•˜๊ฒŒ ์•ˆ์ „ํ•œ ์ข…๋ฅ˜์˜ ์ผ์€ ๋‹ค์Œ์˜ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ์€ ๋™์ผํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ๊ณผ ์ข…์†๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
์˜ค๋Š˜๋‚  noImplicitAny๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด ์ œ์•ˆ์ด ๋ถ€์กฑํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ธฐ์กด ๋™์ž‘์„ ์œ ์ง€ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.
null ํ—ˆ์šฉ ์—ฌ๋ถ€ ์ง€์ •์ž(! ๋˜๋Š” ?). ์ถ”๊ฐ€ํ•  _only_ ์•ˆ์ „ ํ”Œ๋ž˜๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
null ํ—ˆ์šฉ ์—ฌ๋ถ€ ์ง€์ •์ž๊ฐ€ ์—†๋Š” ์œ ํ˜•์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ, ์ฆ‰
์ „๋‹ฌ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋”๋ผ๋„ ์˜๋ฏธ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜
๊ฐ™์€ ์ด์œ ๋กœ noImplicitAny๊ฐ€ ํ—ˆ์šฉ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -135916676
.

@jeffmcaffer ๋‹จ์–ด ์ƒ์œ„ ์ง‘ํ•ฉ๊ณผ ํ•˜์œ„ ์ง‘ํ•ฉ์˜ ์›๋ž˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋งํ•˜๋ ค๋Š” ๋‚ด์šฉ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ง‘ํ•ฉ์˜ ๊ด€์ ์—์„œ ์‰ฝ๊ฒŒ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. string ๊ฐ’ ์ง‘ํ•ฉ์€ !string ๊ฐ’์˜ ์กฐํ•ฉ ์ž…๋‹ˆ๋‹ค !string ๋ฐ ?string ๋Š” !string ๋˜๋Š”/๋ฐ ?string ๊ฐ€ string ์†ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@impinball ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ๋Š” @RyanCavanaugh ์˜ ์ฃผ์„ ์ฝ๊ธฐ์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ์กด ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. export var b = 5; ๋Š” ์ด์ œ !number ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด์ „์—๋Š” number ๋‚ด๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์–ด๋–ค ์˜๋ฏธ์—์„œ. ์ข€ ๋” ํ…Œํฌ๋‹ˆ์ปฌํ•˜๊ฒŒ ๋งํ•˜๋ฉด Union์„ ๋ฐ›์•„๋“ค์ด์ง€๋งŒ
๊ต์ฐจ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ ์œ ํ˜• ๋ชจ๋‘
string ๋ฐ string ๋Š” ๋‘ ์œ ํ˜• ๋ชจ๋‘์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2015๋…„ 8์›” 28์ผ ๊ธˆ์š”์ผ 20์‹œ 20๋ถ„ Aleksey Bykov [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@impinball https://github.com/impinball ํ•˜๋ ค๋Š” ๋ง
๋‹จ์–ด์˜ ์ƒ์œ„ ์ง‘ํ•ฉ๊ณผ ํ•˜์œ„ ์ง‘ํ•ฉ์˜ ์›๋ž˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง‘ํ•ฉ์˜ ๊ด€์ ์—์„œ ์‰ฝ๊ฒŒ ํ‘œํ˜„๋จ: ๋ฌธ์ž์—ด ๊ฐ’์˜ ์ง‘ํ•ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
!string ๋ฐ ?string ๊ฐ’์˜ _union_์€ !string์˜ ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋˜๋Š”/๋ฐ ?string์€ string์— ์†ํ•ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -135920233
.

๋ฌผ๋ก  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ์ ธ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์ •์˜ ํŒŒ์ผ
์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ ์ˆœ์ˆ˜ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๋ณ€๊ฒฝ
์ถ”๊ฐ€(ํ•จ์ˆ˜์— ์ƒˆ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ๋„ JavaScript์—๋Š” ์—†์Œ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘๋‹จํ•˜๋Š” ๋Šฅ๋ ฅ. ์™€ ๋ฒ”์œ„๊ฐ€ ๋น„์Šทํ•˜๋‹ค.
noImplicitAny ๋Š” ์ข€ ๋” ๋ช…์‹œ์ ์ธ ์ž…๋ ฅ์„ ๊ฐ•์š”ํ•œ๋‹ค๋Š” ์ ์—์„œ. ๊ทธ๋ฆฌ๊ณ  ๋‚˜
๊ทธ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
์ด๊ฒƒ์ด ๋‹ค๋ฅธ ํŒŒ์ผ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์‹ค์ œ TypeScript์—์„œ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์†Œ์Šค ํŒŒ์ผ. (๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ๋Š” ์ˆ˜๋งŽ์€ ์ •์˜ ํŒŒ์ผ์„ ๊นจ๊ณ  ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์˜ค๋ฆฌ ํ…Œ์ŠคํŠธ์˜ ๋นˆ๋ฒˆํ•œ ๋ฐฉ๋ฒ•)

2015๋…„ 8์›” 28์ผ ๊ธˆ์š”์ผ 20:21 Jesse Schalken [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@impinball https://github.com/impinball ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๊ทธ๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ๋Š” ๋ณ€๊ฒฝ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ธฐ์กด ์ฝ”๋“œ์˜ ์˜๋ฏธ(@RyanCavanaugh ์ฝ๊ธฐ์—์„œ
https://github.com/RyanCavanaugh์˜ ์ฝ”๋ฉ˜ํŠธ)๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ ๋ณ€์ˆ˜
b = 5; ์ด์ œ ์ด์ „์— ์ˆซ์ž๋ฅผ ๋‚ด๋ณด๋‚ธ !number๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -135920315
.

๋ฌผ๋ก  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ์ ธ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜์ž๋งˆ์ž ์ผ๋ถ€ TypeScript ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  "์ด๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์••๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ฝ”๋“œ์˜ ์˜๋ฏธ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์ปดํŒŒ์ผํ•˜๊ณ  ๊ทธ๊ฒƒ์€ ๋ฐ›์•„ ๋“ค์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์–ธ์–ด๋ฅผ ๋‘˜๋กœ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด ์ œ์•ˆ์ด null ํ—ˆ์šฉ ์—ฌ๋ถ€ ์ง€์ •์ž๊ฐ€ ์—†๋Š” ์œ ํ˜•( ? ๋˜๋Š” ! )์— ๋Œ€ํ•œ ๊ธฐ์กด ๋™์ž‘์„ ์œ ์ง€ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

@jesseschalken
๊ธฐ์กด ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ 100% ์ถฉ์‹คํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ์—์„œ null ์•ˆ์ „์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ํฌ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์œ ํ˜• ์ฃผ์„์— ? ๋ฐ ! ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ •๋„๋กœ ์žฅํ™ฉํ•˜์ง€๋งŒ ๋ชจ๋“  ์œ ํ˜• ์ถ”๋ก ์„ ํฌ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. let x = 3 ๋Š” ์˜ค๋Š˜ number ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ˆ˜๋ฝํ•˜์ง€ ์•Š์œผ๋ฉด null ์•ˆ์ „์˜ ์ด์ ์„ ๋ˆ„๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋„ ํ•˜๊ณ  ์‹ถ์€ ์ผ์ด ์•„๋‹ˆ๋‹ค.

์žฅ์ ์ด ๋‹จ์ ๋ณด๋‹ค ํด ๋•Œ ์•ฝ๊ฐ„์˜ ์–‘๋ณด๊ฐ€ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @impinball ์—์„œ ์ง€์ ํ•œ ๋ฐ”์™€ ๊ฐ™์ด TS ํŒ€์€ noImplicitAny ์ •ํ™•ํžˆ ํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ผค ๋•Œ ์ฝ”๋“œ์— ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธํ„ฐ๋„ท์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ฑฐ๋‚˜ TS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ๊ฐ€ noImplicitAny ๊ฐ€์ •์— ๋”ฐ๋ผ ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

null ์•ˆ์ „๋„ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์˜๋ฏธ๋Š” ๋™์ผํ•˜๋ฉฐ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์˜๋ฏธ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ ํ”Œ๋ž˜๊ทธ( noImplicitNull ) ์•„๋ž˜์—์„œ๋Š” noImplicitNull ๊ฐ€์ •์œผ๋กœ ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ ์ถ”๊ฐ€ ๊ฒ€์‚ฌ ๋ฐ ๊ฒฝ๊ณ /์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

null ์•ˆ์ „๋„ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์˜๋ฏธ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
์ •ํ™•ํžˆ ๋™์ผํ•œ ์˜๋ฏธ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ ํ”Œ๋ž˜๊ทธ ์•„๋ž˜(noImplicitNull ๋˜๋Š” ๋ฌด์—‡์ด๋“  ๋งํ•จ)
๋‹ค์Œ์œผ๋กœ ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ ์ถ”๊ฐ€ ๊ฒ€์‚ฌ ๋ฐ ๊ฒฝ๊ณ /์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
noImplicitNull ๊ฐ€์ •.

๋‚˜๋Š” ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ข‹์•„ํ•˜๊ณ  ์–ธ์–ด๋ฅผ ๋ฐœ์ „์‹œํ‚ค๋Š” ๋…ผ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ํƒ€์ดํ•‘์ด ์ผ๋ฐ˜์ ์œผ๋กœ noImplicitAny๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ์ž‘์„ฑ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ ์ง„์  ์ฑ„ํƒ์— ๊ด€ํ•œ ํ•œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ๋ชจ๋“ˆ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ช…์‹œ์  null์„ ์—ผ๋‘์— ๋‘๊ณ  ์ž‘์„ฑ๋œ ์ƒˆ ์ฝ”๋“œ๊ฐ€ ์•”์‹œ์  null์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ฝ”๋“œ์™€ ์‰ฝ๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

  • -noImplicitNull์„ ์‚ฌ์šฉํ•˜๋ฉด T ๊ฐ€ !T ์˜ ๋ณ„์นญ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด T ์˜ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ”Œ๋ž˜๊ทธ๋Š” ์ƒ๋‹จ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ชจ๋“ˆ๋ณ„๋กœ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. <strong i="18">@ts</strong>:implicit_null . ์ด๋Š” Flow๊ฐ€ ๋ชจ๋“ˆ๋ณ„๋กœ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ณ€ํ™˜์€ ๋จผ์ € -noImplicitNull ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๋ชจ๋“  ๊ธฐ์กด ๋ชจ๋“ˆ์— ' @ts :implicit_null' ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž๋™ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ๊ณผ ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ๋“ˆ์˜ ์•”์‹œ์  ์„ค์ •์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์œ ํ˜•์„ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •์ฑ…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ช…์‹œ์  null์ด ์žˆ๋Š” ๋ชจ๋“ˆ์ด ์•”์‹œ์  null์ด ์žˆ๋Š” ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ์ง€์ ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทน๋‹จ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ T ์œ ํ˜•์˜ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ˆ˜์ž…์ž๊ฐ€ ์œ ํ˜•์„ ?T ๋˜๋Š” !T ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์บ์ŠคํŠธํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ˜ธ์ถœ ์ˆ˜์‹ ์ž์— ๋งŽ์€ ์ฃผ์„์ด ํ•„์š”ํ•˜์ง€๋งŒ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ€์ ธ์˜จ ๋ชจ๋“  T ์œ ํ˜•์„ ?T ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ํ˜ธ์ถœ์ž์—์„œ ๋งŽ์€ ์ฃผ์„์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์ ธ์˜จ ๋ชจ๋“  T ์œ ํ˜•์€ !T ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ํ‹€๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ์‹ค์šฉ์ ์ธ ์˜ต์…˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. any ์œ ํ˜•์˜ ๋ณ€์ˆ˜๊ฐ€ T ์œ ํ˜•์˜ ๊ฐ’์— ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐ?

@jods4 noImplicitAny ํ”Œ๋ž˜๊ทธ๋Š” ๊ธฐ์กด ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ _์•Š์Šต๋‹ˆ๋‹ค_. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•”์‹œ์ ์ผ ๊ฒƒ์— ๋Œ€ํ•ด ์ฝ”๋“œ๊ฐ€ ๋ช…์‹œ์ ์ด์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

| ์ฝ”๋“œ | ๊นƒ๋ฐœ | ์˜๋ฏธ |
| --- | --- | --- |
| interface Foo { blah; } | | interface Foo { blah:any; } |
| interface Foo { blah; } | noImplicitAny | ์˜ค๋ฅ˜, ๋ช…์‹œ์  ์œ ํ˜• ํ•„์š” |
| var foo = 'blah' | | var foo:string = 'blah' |
| var foo = 'blah' | noImplicitNull | var foo:!string = 'blah' |

noImplicitNull ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด null์„ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ธฐ ์ „์—. ์ด์ œ null _cannot_ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. noImplicitAny ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ง์Šน์ž…๋‹ˆ๋‹ค.

@RyanCavanaugh ๋Š” ์ด๋ฏธ ๊ธฐ์กด ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ฐฐ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. TS ํŒ€์˜ ๋ช…์‹œ์  ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋‹จํ˜ธํ•˜๊ฒŒ ๋ฌด์‹œํ•œ๋‹ค๋ฉด ์ด ํ‹ฐ์ผ“์€ 1๋…„ ๋” ๋ฒ„ํ‹ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jesseschalken ์ฃ„์†กํ•˜์ง€๋งŒ ์ฐจ์ด์ ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
noImplicitAny ์ „์— ์ฝ”๋“œ์— ๋‹ค์Œ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
let double = x => x*2;
์ปดํŒŒ์ผ๋˜๊ณ  ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ noImplicitAny ๋ฅผ ์ผœ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” x ๊ฐ€ ์•”์‹œ์ ์œผ๋กœ any๋ผ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
let double = (x: any) => x*2 ์ด์ƒ let double = (x: number) => x*2 .
์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” JS ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค(์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๋ฐฉ์ถœ์„ ๋„์ง€ ์•Š๋Š” ํ•œ).

null์˜ ์ƒํ™ฉ์€ ๋‚ด ์ƒ๊ฐ์— ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ T ๊ฐ€ nullable์ด ์•„๋‹ˆ๊ณ  T? ๋˜๋Š” T | null T ๋ฐ null ์œ ํ˜•์˜ ํ•ฉ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ „์—:
let foo: string; foo = null; ๋˜๋Š” let foo = "X"; foo = null string ๋กœ ์ถ”์ •๋ฉ๋‹ˆ๋‹ค.
์ปดํŒŒ์ผ๋˜๊ณ  ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ƒˆ๋กœ์šด noImplicitNull ํ”Œ๋ž˜๊ทธ๋ฅผ ์ผญ๋‹ˆ๋‹ค. ๊ฐ‘์ž๊ธฐ TS๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์— null ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํƒ€์ดํ•‘ ์˜ค๋ฅ˜๋ฅผ ์ œ์™ธํ•˜๊ณ  ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ _๋™์ผํ•œ_ ์˜ฌ๋ฐ”๋ฅธ JS ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜๋„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ช…์‹œํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
string? foo; foo = null;

์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋˜๊ณ  ๋Ÿฐํƒ€์ž„ ๋™์ž‘์€ ์ „ํ˜€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ํƒ€์ดํ•‘ ์‹œ์Šคํ…œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์œ ํ˜• ์„ ์–ธ์—์„œ ๋” ๋ช…์‹œ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ strict ํ”Œ๋ž˜๊ทธ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ˆ ์ƒํƒœ๋กœ ์ปดํŒŒ์ผํ•ด๋„ ์˜ค๋ฅ˜ ์—†์ด ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@robertknight ๋‚ด ํ˜„์žฌ ์ƒ๊ฐ์— ๋งค์šฐ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

์—„๊ฒฉํ•œ null์ด ์•„๋‹Œ ์œ ํ˜•์„ ์„ ํƒํ•˜์ง€ ์•Š์€ ๋ชจ๋“ˆ/์ •์˜์˜ ๊ฒฝ์šฐ T ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ์„ ์˜๋ฏธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์—์„œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ null ์˜ค๋ฅ˜๋ฅผ ๋•๋‹ˆ๋‹ค. T? ๋กœ ๊ฐ•์ œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—ฌ์ „ํžˆ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์˜ค๋Š˜๋‚  ์ผ๋ถ€ T ๋Š” ์‹ค์ œ๋กœ nullable์ด ์•„๋‹ˆ๊ณ  ์ผ๋ถ€๋Š” nullable์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜๋‹ค:

// In a strict module, function len does not accept nulls
function len(x: string): number { return x.length; }
// In a legacy module, some calls to len
let abc: string = "abc";
len(abc);

๋ ˆ๊ฑฐ์‹œ ๋ชจ๋“ˆ์—์„œ string ๋ณ„์นญ์„ string? ๋กœ ์ง€์ •ํ•˜๋ฉด null ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

@jods4 ๋‚ด ๋Œ“๊ธ€์„ ๋‹ค์‹œ ์ฝ์–ด๋ณด์„ธ์š”. ํ…Œ์ด๋ธ”์„ ๋ณด์„ธ์š”. ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ์ •์˜ ๋„ฃ์–ด ๋‹น์‹ ์˜ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ œ์ž‘ ๋œ foo ์™€ ํ• ๋‹น์„ foo ์„œ๋กœ ์˜†์—. noImplicitAny ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์œ ์ผํ•œ ์˜ค๋ฅ˜๋Š” ํŠนํžˆ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(๊ทธ ์˜๋ฏธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„๋˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ). noImplicitNull ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚จ ์ฝ”๋“œ๋Š” foo ์— ๋Œ€ํ•œ _assignment_ ์˜€์ง€๋งŒ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด(์ด์ „ ์˜๋ฏธ๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด) ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋Š” foo ์˜ _definition_์ด์—ˆ์Šต๋‹ˆ๋‹ค foo ์ •์˜์˜ ์˜๋ฏธ๋ฅผ _๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํ• ๋‹น๊ณผ ์ •์˜๋Š” ๋ถ„๋ช…ํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๊ณ„์˜ ๋‹ค๋ฅธ ์ชฝ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. noImplicitNull ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค _์˜๋ฏธ_๋ฅผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค!

ํ”Œ๋ž˜๊ทธ๋Š” foo ์ •์˜์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

์‘ ๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด์•ผ. "๋ณ€์ˆ˜๊ฐ€ null์„ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์กฐ๊ธˆ๋„ ์•Œ ์ˆ˜ ์—†๊ณ  -- ๊ทธ๋ƒฅ ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."์—์„œ "์ด ๋ณ€์ˆ˜๋Š” null์ด ์—†์Šต๋‹ˆ๋‹ค."๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์˜ณ์•˜์„ ๊ฐ€๋Šฅ์„ฑ์€ 50/50์ด๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์„ ์–ธ์—์„œ ์˜๋„๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๊ฒฐ๊ณผ๋Š” noImplicitAny ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์„ ์–ธ์—์„œ ์˜๋„๋ฅผ ๋” ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ• ๋‹น๊ณผ ์ •์˜๋Š” ๋ถ„๋ช…ํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๊ณ„์˜ ๋‹ค๋ฅธ ์ชฝ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ์–ธ๊ณผ ๋‚ด ์ฝ”๋“œ์—์„œ์˜ ์‚ฌ์šฉ. ์ง€๊ธˆ:

  1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—„๊ฒฉํ•œ null์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ์œ ํ˜•์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์—„๊ฒฉํ•œ null ์œ ํ˜•์ด ์žˆ๊ณ  x ๊ฐ€ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉด null์„ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ _์‹ค์ œ๋กœ ๋ณด๊ณ ๋˜์–ด์•ผ ํ•˜๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค_.
  2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—„๊ฒฉํ•œ null์„ ์„ ํƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ”Œ๋ž˜๊ทธ( noImplicitAny ์™€ ์œ ์‚ฌ)๋Š” ์ฝ”๋“œ๋ฅผ ์กฐ์ •ํ•˜์ง€ ์•Š๊ณ ๋Š” ์ผค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ์š”์ ์„ ์•Œ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์˜๋ฏธ ์ฝ”๋“œ๋ฅผ _๋ณ€๊ฒฝ_ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ์šฐ๋ฆฌ๋Š” ์˜ค๋Š˜๋‚  ์œ ํ˜• ์‹œ์Šคํ…œ์— ์˜ํ•ด _ํ‘œํ˜„๋˜์ง€ ์•Š๋Š” ์˜๋ฏธ๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜ค๋Š˜๋‚  ์ฝ”๋“œ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ๋Ÿฌํ•œ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋Š” TS์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ null์ด ์•„๋‹Œ ์œ ํ˜•์ด ์ ˆ๋Œ€ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

nullable์ด ์•„๋‹Œ ์œ ํ˜•์— ๋Œ€ํ•œ ํฌ์†Œ์‹์ž…๋‹ˆ๋‹ค! TS ํŒ€์ด TS ์—…๋ฐ์ดํŠธ์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž…ํ•˜๋Š” ๋ฐ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!
๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
http://blogs.msdn.com/b/typescript/archive/2015/09/02/announcing-typescript-1-6-beta-react-jsx-better-error-checking-and-more.aspx
๊ทธ๋“ค์€ ์ƒˆ๋กœ์šด ํŒŒ์ผ ์œ ํ˜•์œผ๋กœ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์ƒํ˜ธ ๋ฐฐํƒ€์ ์ธ ์„ ํƒ์  ๊ตฌ๋ฌธ)์„ ๋„์ž…ํ•˜๊ณ , ์ƒˆ๋กœ์šด ํŒŒ์ผ ์œ ํ˜• ์—†์ด _์—†๋Š”_ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค(๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์นจ).
์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ nullable์ด ์•„๋‹Œ ์œ ํ˜•(์˜ˆ: .sts ๋˜๋Š” ์—„๊ฒฉํ•œ Typescript ํ™•์žฅ ๋ฐ ํ•ด๋‹น .sdts)๊ณผ ๋…ผ์Ÿํ•  ์ˆ˜ ์žˆ๋Š” ์„ ๋ก€์ž…๋‹ˆ๋‹ค.

์ด์ œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ์œ ํ˜• ๋˜๋Š” null ์œ ํ˜•(๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๊ตฌ๋ฌธ)์„ ํ™•์ธํ•˜๋ ค๊ณ  ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•˜๋ฉฐ ํ™•์‹คํ•œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@jbondc ๋งค์šฐ ํฅ๋ฏธ๋กญ๊ฒŒ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. NNBD(๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด ์•„๋‹˜)๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์„ ํƒ์  non-nullable๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‰ฝ๋‹ค๋Š” ๋‚˜์˜ ์ง๊ฐ์ด ์—ฐ๊ตฌ(๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด 10๋ฐฐ ์ ์Œ, Dart์˜ ๊ฒฝ์šฐ 1- ์ฝ”๋“œ 1000์ค„๋‹น 2๊ฐœ์˜ ์ฃผ์„์— nullity ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋ฉฐ null์ด ๋งŽ์€ ์ฝ”๋“œ์—์„œ๋„ 10๊ฐœ ์ดํ•˜)

๋ฌธ์„œ์˜ ๋ณต์žก์„ฑ์ด ์‹ค์ œ๋กœ nullable์ด ์•„๋‹Œ ์œ ํ˜•์˜ ๋ณต์žก์„ฑ์„ ๋ฐ˜์˜ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ œ๋„ค๋ฆญ ์„น์…˜์—์„œ๋Š” 3๊ฐ€์ง€ ์œ ํ˜•์˜ ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋…ผ์˜ํ•œ ๋‹ค์Œ ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. TS์—์„œ null ๋Š” ๋‹จ์ˆœํžˆ ์™„์ „ํžˆ ๋น„์–ด ์žˆ๋Š” ๋ ˆ์ฝ”๋“œ์˜ ์œ ํ˜•(์†์„ฑ, ๋ฉ”์„œ๋“œ ์—†์Œ)์ด ๋˜๋Š” ๋ฐ˜๋ฉด {} ๋Š” ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ null ์œ ํ˜•์ด ๋˜๊ณ  null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ œ๋„ค๋ฆญ์€ ๋‹จ์ˆœํžˆ G<T extends {}> - ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ํ•„์š”๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ var !x ์™€ ๊ฐ™์€ ๋น„ํ•„์ˆ˜ ์„คํƒ•์„ ๋งŽ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๊ธฐ์กด ์–ธ์–ด์— ๋Œ€ํ•œ ์„ค๋ฌธ์กฐ์‚ฌ๋Š” ์ง„์ •ํ•œ ๋ณด์„์ž…๋‹ˆ๋‹ค.

๋ฌธ์„œ๋ฅผ ์ฝ์œผ๋ฉด์„œ Optional / Maybe ์œ ํ˜•์ด nullable ์œ ํ˜•๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ผ๋ฐ˜ ์ปจํ…์ŠคํŠธ์—์„œ - ์ฃผ๋กœ Just(Nothing) ๋ฅผ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด T ์œ ํ˜•์˜ ๊ฐ’์„ ํฌํ•จํ•˜๊ณ  ํ‚ค์˜ ์กด์žฌ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” get ๋ฅผ ์ง€์›ํ•˜๋Š” ์ผ๋ฐ˜ Map ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ:

interface Map<T> {
  get(s:string):Maybe<T>
}

T ๊ฐ€ Maybe<U> ์œ ํ˜•์ด ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ž˜ ์ž‘๋™ํ•˜๊ณ  ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค Just(Nothing) ํ‚ค๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ์ด ํฌํ•จ ๋œ ๊ฒฝ์šฐ Nothing ๊ฐ’์„ ๋‹จ์ˆœํžˆ ๋ฐ˜ํ™˜ Nothing ํ‚ค๊ฐ€ ์ „ํ˜€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ nullable ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

interface Map<T> {
  get(s:string):T?
}

T ๊ฐ€ nullable

์–ด๋Š ์ชฝ์ด๋“ , nullable๊ณผ non-nullable ๊ฐ’์„ ๊ตฌ๋ณ„ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋ชจ๋“  ์œ ํ˜•์˜ ์•ˆ์ „์„ ์œ„ํ•œ ์ „์ œ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

@jbondc ์ด๊ฒƒ์€ ๋งค์šฐ

์—ฐ๊ตฌ์— ๋”ฐ๋ฅด๋ฉด ์„ ์–ธ์˜ 80%๊ฐ€ ์‹ค์ œ๋กœ null์ด ์•„๋‹˜์„ ์˜๋ฏธํ•˜๊ฑฐ๋‚˜ KLOC๋‹น nullity ์ฃผ์„์ด 20๊ฐœ๋ฟ์ด๋ผ๋Š” ์—ฐ๊ตฌ ๊ฒฐ๊ณผ(p. 21)๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์œ„์•ˆ์ด ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์— ์–ธ๊ธ‰๋œ ๋ฐ”์™€ ๊ฐ™์ด ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ null์ด ์•„๋‹Œ ๊ฒƒ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ด๋ฉฐ ๋‚ด ๋Š๋‚Œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

: null ์ด์™ธ์˜ ์ฐฌ์„ฑ ๋˜ ๋‹ค๋ฅธ ์ธ์ˆ˜๋Š” ๊นจ๋—ํ•œ ํ˜•์‹ ์‹œ์Šคํ…œ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค null ์ž์‹ ์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค T ์ž…๋‹ˆ๋‹ค null์ด ์•„๋‹Œ ๋ฐ T? ๋™์˜์–ด์ž…๋‹ˆ๋‹ค T | null . TS์—๋Š” ์ด๋ฏธ ์œ ๋‹ˆ์˜จ ์œ ํ˜•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ ํ›Œ๋ฅญํ•˜๊ณ  ๊นจ๋—ํ•˜๋ฉฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃฌ ์ตœ๊ทผ ์–ธ์–ด ๋ชฉ๋ก์„ ๋ณด๋ฉด ์ƒˆ๋กœ์šด ํ˜„๋Œ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ด ์˜ค๋žœ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ null ๋ฒ„๊ทธ๋ฅผ ์ค„์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ๋ชจ๋ธ๋ง๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ TS๊ฐ€ ์–ธ์  ๊ฐ€ ๊ทธ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

T! ์—ฐ์‚ฐ์ž๊ฐ€ ํฅ๋ฏธ๋กญ๊ณ  ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. T ๊ฐ€ null์ด ์•„๋‹Œ ์œ ํ˜•์ด๊ณ  T? ๊ฐ€ T | null ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ null ์ž…๋ ฅ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  null์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜๋Š” ์ผ๋ฐ˜ API๋ฅผ ์‹ค์ œ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋‚˜๋ฅผ ๊ท€์ฐฎ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์—†์ง€๋งŒ ์ด๋ก ์ƒ function defined(x) { return x || false; } ์ถฉ์‹คํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
null์ด ์•„๋‹Œ ๋ฐ˜์ „ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ function defined<T>(x: T): T! | boolean ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. defined ์ด T ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ผ๋ฐ˜ T ์ œ์•ฝ ์กฐ๊ฑด์ด nullable์ด๋”๋ผ๋„ null์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค(์˜ˆ string? . ๊ทธ๋ฆฌ๊ณ  TS์—์„œ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. T! ์ฃผ์–ด์กŒ์„ ๋•Œ T ๊ฐ€ null ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ๊ณต์šฉ์ฒด ์œ ํ˜•์ด๋ฉด null ์กฐํ•ฉ์—์„œ

@spion

๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ๋‚˜๋Š” Optional / Maybe ์œ ํ˜•์ด nullable ์œ ํ˜•๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

Maybe ๊ตฌ์กฐ๋ฅผ ์ค‘์ฒฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ null ์ค‘์ฒฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด API๋ฅผ ์ •์˜ํ•˜๋Š” ๋งฅ๋ฝ์—์„œ ํฅ๋ฏธ๋กœ์šด ๋…ผ์˜์ด์ง€๋งŒ ๊ธฐ์กด API๋ฅผ ๋งคํ•‘ํ•  ๋•Œ๋Š” ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ๋งต Null์„ Maybe ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜๋ฅผ ์™„์ „ํžˆ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ํ•œ ํ•ด๋‹น ์ด์ ์„ ํ™œ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Maybe ๋Š” ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€์˜ ๋‘ ๊ฐ€์ง€ ๊ณ ์œ ํ•œ ์ •๋ณด๋ฅผ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. Map ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  C#์„ ๋ณด๋ฉด Dictionary<T,K> ์—์„œ ์ด๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
bool TryGet(K key, out T value) .
C#์— ํŠœํ”Œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ(์•„๋งˆ๋„ C# 7) ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
(bool hasKey, T value) TryGet(K key)
๊ธฐ๋ณธ์ ์œผ๋กœ Maybe ์ด๊ณ  null ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JS์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ ์œ ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ undefined ์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ํฅ๋ฏธ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋งŽ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ JS Map ๋Š” ํ‚ค๊ฐ€ ์—†์œผ๋ฉด undefined ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null ํฌํ•จํ•˜์—ฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

C# 7 ๊ด€๋ จ ์ œ์•ˆ - https://github.com/dotnet/roslyn/issues/5032

๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ undefined๋ฅผ ๋ชจ๋ธ๋งํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  null ๋ฌธ์ œ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค(์–ด์จŒ๋“  ์ด ๋ฌธ์ œ๊ฐ€ ๋” ๋„๋ฆฌ ํผ์ ธ ์žˆ์Œ).

@๊ทธ๋ฆฌํฌํฌ

๋ชจ๋“  null ๋ฌธ์ œ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ, ์™œ ๊ทธ๋Ÿด๊นŒ์š”?
๋‚ด null ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ์ •์˜๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๊ฐ€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค, undefined ๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์ฝ”๋”ฉ ์Šคํƒ€์ผ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ•์ œ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” undefined ํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, null ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ 90%๊ฐ€ ๋” ์•ˆ์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ•์ œ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ฑฐ์˜ ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

JavaScript๊ฐ€ ๋งค ํ„ด๋งˆ๋‹ค undefined ๋ฅผ ๊ฐ•์ œ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜. let x; alert(x);
  • ํ•จ์ˆ˜ ์ธ์ˆ˜๋ฅผ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค. let foo = (a?) => alert(a); foo();
  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐฐ์—ด ์š”์†Œ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. let x = []; alert(x[0]);
  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐœ์ฒด ์†์„ฑ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. let x = {}; alert(x['foo']);

๋ฐ˜๋ฉด์— Null์€ ๋” ์ ๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • DOM ์•ก์„ธ์Šค. alert(document.getElementById('nonExistent'));
  • ํƒ€์‚ฌ ์›น ์„œ๋น„์Šค ์‘๋‹ต( JSON.stringify ์ŠคํŠธ๋ฆฝ undefined ) . { name: "Joe", address: null }
  • ์ •๊ทœ์‹.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์šฐ๋ฆฌ๋Š” null ์˜ ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•˜๊ณ  ์œ ์„ ์„ ํ†ตํ•ด ์ˆ˜์‹ ๋œ ๋ชจ๋“  null ๋ฅผ undefined ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ํ•ญ์ƒ undefined ๋Œ€ํ•ด ์—„๊ฒฉํ•œ ํ‰๋“ฑ ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‚˜๋Š” undefined ๋ฌธ์ œ๊ฐ€ ๋” ๋„๋ฆฌ ํผ์ง„ ๋ฌธ์ œ๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

@NoelAbrahams ์ฝ”๋”ฉ ์Šคํƒ€์ผ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค :)

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜

๋‚˜๋Š” ํ•ญ์ƒ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  noImplicitAny ์ผœ๋‘๋ฏ€๋กœ let x ๋Š” ์–ด์จŒ๋“  ์˜ค๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ทผ์ ‘๊ธฐ๋Š” let x: any = null . ๋น„๋ก ์ž์ฃผ ์ž‘์„ฑํ•˜์ง€๋Š” ์•Š๋Š” ์ฝ”๋“œ์ง€๋งŒ ๋ง์ž…๋‹ˆ๋‹ค.

์„ ํƒ์  ๊ธฐ๋Šฅ ๋งค๊ฐœ๋ณ€์ˆ˜

๋‚˜๋Š” ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๊ทธ๊ฒƒ์ด ๋” ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฝ๊ณ  ์–ด๋–ป๊ฒŒ๋“  ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?). ๊ทธ๋ž˜์„œ ๋‚˜๋ฅผ ์œ„ํ•ด: function f(name?: string = null, options?: any = {}) .
์›์‹œ undefined ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์€ ์ €์—๊ฒŒ _์˜ˆ์™ธ_ ๊ฒฝ์šฐ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐฐ์—ด ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ

์ด๊ฒƒ์€ ๋‚ด ์ฝ”๋“œ์—์„œ ํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋„๋ก ๋ฐฐ์—ด ๊ธธ์ด๋ฅผ ํ™•์ธํ•˜๊ณ  ํฌ์†Œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋˜๋Š” null , 0 , ...์™€ ๊ฐ™์€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋นˆ ์Šฌ๋กฏ์„ ์ฑ„์šฐ๋ ค๊ณ  ์‹œ๋„).
๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋‚ด๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•  ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๊ทœ์น™์ด ์•„๋‹ˆ๋ผ _์˜ˆ์™ธ_๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐœ์ฒด ์†์„ฑ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ์™€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์€ ๋‚ด๊ฐ€๋กœ ์„ค์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ๋‚ด ๊ฐ์ฒด๋Š”, ์ž…๋ ฅ๋˜๋Š” null ํ•˜์ง€ undefined . ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋‹น์‹ ์€ (์‚ฌ์ „ ์กฐ์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€) ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ๋“ค์€ _์—ฃ์ง€ ์ผ€์ด์Šค_์ด๊ณ  ๋‚ด ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ๋Œ€ํ‘œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

undefined ๋Œ๋ ค๋ฐ›๋Š” ๋ชจ๋“  _์˜ˆ์™ธ์ ์ธ_ ๊ฒฝ์šฐ์—๋Š” ์ฆ‰์‹œ undefined ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ณ  ๋” ์ด์ƒ ์ „ํŒŒํ•˜๊ฑฐ๋‚˜ "์ž‘์—…"ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. null ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์ƒ TS ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ผ๋ฐ˜์ ์ธ ์‹ค์ œ ์˜ˆ:

let cats: Cat[];
// Note that find returns undefined if there's no cat named Kitty
let myFavoriteCat = cats.find(c => c.name === 'Kitty'); 
if (myFavoriteCat === undefined) {
  // Immediately do something to compensate here:
  // return false; or 
  // myFavoriteCat = new Cat('Kitty'); or
  // whatever makes sense.
}
// Continue with assurance that myFavoriteCat is not null (it was an array of non-nullable cats after all).

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์šฐ๋ฆฌ๋Š” null ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•˜๊ณ  ์œ ์„ ์„ ํ†ตํ•ด ์ˆ˜์‹ ๋œ ๋ชจ๋“  null์„ undefined ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉฐ ํ•ญ์ƒ undefined ์— ๋Œ€ํ•ด ์—„๊ฒฉํ•œ ๋™๋“ฑ ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์œผ๋กœ ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚˜์™€ ๋งค์šฐ ๋‹ค๋ฅธ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ณณ์—์„œ undefined ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ •์ ์œผ๋กœ ํ™•์ธ๋œ null ์œ ํ˜•์ด ๋‚˜๋ณด๋‹ค ํ›จ์”ฌ ์ ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ ๊ฒƒ์ด๋‹ค.

์˜ˆ, undefined ๋•Œ๋ฌธ์— 100% ๋ฐฉ์ˆ˜๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ด ์ ์—์„œ 100% ์ •ํ™•ํ•˜๊ณ  ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. JS๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๊ณณ์—์„œ undefined ๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ๋‚ด ๋‹ต๋ณ€์—์„œ ์•Œ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด null ๊ฒ€์‚ฌ์˜ ์ด์ ์ด _๋งŽ์ด_ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋‚ด ์˜๊ฒฌ์€ ๋‚ด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ๋งŽ์€ ์–ด๋ฆฌ์„์€ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋‚ด ํŒ€ ํ™˜๊ฒฝ์—์„œ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jods4 , ๋‹น์‹ ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ฝ๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์› ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋ฐ˜๋Œ€ ์˜๊ฒฌ์€ ์ค€์ˆ˜ํ•ด์•ผ ํ•  ๊ทœ์น™์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๊ณต์‚ฐ์ฃผ์˜ ๋Œ€ ์ž์œ  ์‹œ์žฅ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.๋ฏธ์†Œ:

TSํŒ€์€ ๋‚ด๋ถ€์  ์œผ๋กœ ์ €ํฌ์™€ ๋น„์Šทํ•œ ์Šคํƒ€์ผ

@NoelAbrahams " undefined "์€ " null ์‚ฌ์šฉ"๊ณผ ๊ฐ™์€ ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ผ๊ด€์„ฑ์ด ํ•ต์‹ฌ์ด๋ฉฐ null ๋˜๋Š” undefined (๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด ๋˜๋Š” 0)์ด์–ด์•ผ ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ๋Š” ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ TS๋Š” ํ˜„์žฌ์ด ๋ฌธ์ œ์— ๋„์›€์ด๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ...

๋‚˜๋Š” TS๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ทœ์น™์ด ์•Œ๊ณ  undefined ์ด์ƒ null ์„ ํƒ ๋’ค์— ์ด์ƒ์˜ ์ธ์ˆ˜๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ์ด ์„ ํƒ ๋˜๋Š” "์ผ๊ด€์„ฑ์„ ์œ„ํ•ด์„œ"์ž„์˜์˜ ๊ฒฝ์šฐ, ๋‚ด๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ด์œ ๋Š” null ๋ณด๋‹ค๋Š” undefined :

  1. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์นœ์ˆ™ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด C#๊ณผ ๊ฐ™์€ ์ •์  OO ์–ธ์–ด์—์„œ ์™”์Šต๋‹ˆ๋‹ค.
  2. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์€ ์–ธ์–ด์—์„œ ์ฝ”๋“œ ๋ƒ„์ƒˆ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ JS์—์„œ๋Š” ์™œ ๋‹ฌ๋ผ์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ํ•˜์„ธ์š”.
  3. JS๋Š” ๋™์  ์–ธ์–ด์ด์ง€๋งŒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ •์  ์œ ํ˜•์ด ์„ฑ๋Šฅ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ์†์„ฑ์„ null ๋ณด๋‹ค delete null ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  4. ๊ทธ๊ฒƒ์€ ๊ฐ„์˜ ์ฐจ์ด ๊นจ๋— ์ง€์› null ์ •์˜ํ•˜์ง€๋งŒ ๊ฐ’์ด ์—†์Œ์„ ์˜๋ฏธํ•˜๊ณ , undefined ... ์ •์˜๋˜์ง€ ์•Š๋Š”๋‹ค. ๋‘˜ ์‚ฌ์ด์˜ ์ฐจ์ด๊ฐ€ ๋ถ„๋ช…ํ•œ ๊ณณ: ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด undefined ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ undefined ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋นˆ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ _pass_ํ•ฉ๋‹ˆ๊นŒ? null ์‚ฌ์šฉํ•ด๋„ ๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค.
  5. ์ด๊ฒƒ์€ undefined ์‹ค์ œ๋กœ ์‹ค์šฉ์ ์ด์ง€ ์•Š์€ ์ด ์Šค๋ ˆ๋“œ์—์„œ ๋…ผ์˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ null ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ๊นจ๋—ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก ๋‚ด๊ฐ€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ณต์ƒ์„ ํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ.
  6. ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. IMHO null ๋Š” undefined ๋งŒํผ ์ข‹์Šต๋‹ˆ๋‹ค.

undefined ๋ฅผ null ๋ณด๋‹ค ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
obj.nonexistentProp ๋ฐ˜ํ™˜์˜ ๊ธฐ๋ณธ ์ธ์ˆ˜ ๋ฐ ์ผ๊ด€์„ฑ
undefined .

๊ทธ ์™ธ์—๋Š” null๋กœ ๊ฐ„์ฃผ๋˜๋Š” ํ•ญ๋ชฉ์— ๋Œ€ํ•ด bikeshedding์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
๋ณ€์ˆ˜๊ฐ€ nullable์ด์–ด์•ผ ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

2015๋…„ 9์›” 8์ผ ํ™”์š”์ผ 06:48 jods [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@NoelAbrahams https://github.com/NoelAbrahams "์ •์˜๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ"์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
"๋„ ์‚ฌ์šฉ"๊ณผ ๊ฐ™์€ ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ผ๊ด€์„ฑ์ด ํ•ต์‹ฌ์ด๊ณ  ๋‚ด๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์‚ฌ๋ฌผ์ด null์ธ์ง€ ์ •์˜๋˜์ง€ ์•Š์€(๋˜๋Š” ๋น„์–ด ์žˆ๋Š”์ง€) ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ฌธ์ž์—ด ๋˜๋Š” 0). ํŠนํžˆ TS๋Š” ํ˜„์žฌ ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—
๋ฌธ์ œ...

TS์— null๋ณด๋‹ค undefined๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
"์ผ๊ด€์„ฑ์„ ์œ„ํ•ด" ์ž„์˜์ ์ธ ์„ ํƒ์ด๊ฑฐ๋‚˜ ๋” ๋งŽ์€ ๊ฒฝ์šฐ
์„ ํƒ ๋’ค์— ์žˆ๋Š” ์ฃผ์žฅ.

_I_๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ๋ณด๋‹ค null์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ์ด์œ :

  1. ์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์นœ์ˆ™ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ •์  OO์—์„œ ๋‚˜์˜ต๋‹ˆ๋‹ค.
    C#๊ณผ ๊ฐ™์€ ์–ธ์–ด.
  2. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ ๋ƒ„์ƒˆ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.
    ๋งŽ์€ ์–ธ์–ด, ์™œ JS์—์„œ ๋‹ฌ๋ผ์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋„ˆ์˜ ~์„ ๋งŒ๋“ค์–ด๋ผ
    ์˜๋„๊ฐ€ ๋ถ„๋ช…ํ•˜๋‹ค.
  3. JS๋Š” ๋™์  ์–ธ์–ด์ด์ง€๋งŒ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.
    ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ •์  ์œ ํ˜•. ์†์„ฑ์„ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
    ์‚ญ์ œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค null์ž…๋‹ˆ๋‹ค.
  4. ์ •์˜๋œ null ์‚ฌ์ด์˜ ๋ช…ํ™•ํ•œ ์ฐจ์ด๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ
    ๊ฐ’์˜ ๋ถ€์žฌ๋ฅผ ์˜๋ฏธํ•˜๊ณ  undefined๋Š”... undefined๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    ๋‘˜์˜ ์ฐจ์ด๊ฐ€ ๋ถ„๋ช…ํ•œ ๊ณณ: ์„ ํƒ ์‚ฌํ•ญ
    ๋งค๊ฐœ๋ณ€์ˆ˜. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์–ด๋–ป๊ฒŒ
    _pass_ ์ฝ”๋“œ์—์„œ undefined๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋นˆ ๊ฐ’
    ๋ฒ ์ด์Šค? null์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  5. ์ด ํ•ญ๋ชฉ์—์„œ ๋…ผ์˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ null ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ๊นจ๋—ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    ์Šค๋ ˆ๋“œ๋Š” undefined๋กœ ์‹ค์ œ๋กœ ์‹ค์šฉ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„
    ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ณต์ƒ์„ ํ•˜๊ณ  ์žˆ๋‹ค.
  6. ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. IMHO null์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    ์ฐพ์œผ์‹œ๋Š” ์ฃผ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -138514437
.

@impinball
๋ชจ๋“  github ํ† ๋ก ์—์„œ "bikeshedding" ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? undefined ๋˜๋Š” null ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŒ€ ๊ธฐ๋ณธ ์„ค์ •์ด๋ผ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ null ๊ฒ€์‚ฌ์— undefined ๋ฅผ ํฌํ•จํ• ์ง€ ์—ฌ๋ถ€์™€ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋ฌธ์ œ๋Š” ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ์–ด๋–ป๊ฒŒ ์ž์ „๊ฑฐ๋ฅผ ๋ชฐ๊ณ  ๊ฐ€๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๊นŒ?

nullable์ด ์•„๋‹Œ ์œ ํ˜•์œผ๋กœ TS 1.5์˜ ํฌํฌ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์œผ๋ฉฐ ๋†€๋ผ์šธ ์ •๋„๋กœ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต์‹ TS ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ nullable์ด ์•„๋‹Œ ํ˜•์‹์„ ๊ฐ–๊ธฐ ์œ„ํ•ด ํ•ฉ์˜๊ฐ€ ํ•„์š”ํ•œ ๋‘ ๊ฐ€์ง€ ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์œ„์—์„œ ๋ช…ํ™•ํ•œ ๊ฒฐ๋ก  ์—†์ด ๊ธธ๊ฒŒ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. undefined ๋ฌด์—‡์„ ํ• ๊นŒ์š”? (๋‚ด ์˜๊ฒฌ: ์—ฌ์ „ํžˆ ๋„์ฒ˜์— ์žˆ๊ณ  ํ™•์ธ๋˜์ง€ ์•Š์Œ)
  2. ๊ธฐ์กด ์ฝ”๋“œ, ํŠนํžˆ ์ •์˜์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? (๋‚ด ์˜๊ฒฌ: ์ตœ์†Œํ•œ ์ •์˜ ํŒŒ์ผ๋‹น ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. null ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ผœ๋Š” ๊ฒƒ์€ "์ค‘๋‹จ"์ž…๋‹ˆ๋‹ค.)

๋‚ด ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์€ null๊ณผ undefined๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ฌดํšจํ™”๋ฅผ ์œ„ํ•ด ๋™๋“ฑํ•˜๊ฒŒ. ๋‘˜ ๋‹ค ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์‚ฌ์šฉ๋˜๋ฉฐ,
๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๊ฐ€์น˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ฐ€์น˜๊ฐ€ ํ•œ๋•Œ ์กด์žฌํ–ˆ์ง€๋งŒ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค
null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ JS ํ•จ์ˆ˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๋งŽ์€
DOM ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋Š” null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋™์ผํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ,
๋™๋“ฑํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

bikeshedding ์ฐธ์กฐ๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ ์ธ์ˆ˜์— ๋Œ€ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ’์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ์ฃผ์žฅ
๊ทธ๋ƒฅ null, ์ผ๋ถ€๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜๊ณ  ์ผ๋ถ€๋Š” ๋…ผ์Ÿ ์ค‘์ž…๋‹ˆ๋‹ค.
ํ˜ผํ•ฉ๋ฌผ. ์ด ์ œ์•ˆ์€ ๊ทธ ์ค‘ ํ•œ ๊ฐ€์ง€์—๋งŒ ๊ตญํ•œ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

2015๋…„ 9์›” 8์ผ ํ™”์š”์ผ 13:28 jods [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@impinball https://github.com/impinball
๋ชจ๋“  github ํ† ๋ก ์—์„œ "bikeshedding" ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์šฐ๋ฆฌ๋Š” ์•ˆ์ „ํ•˜๊ฒŒ
undefined ๋˜๋Š” null์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŒ€ ๊ธฐ๋ณธ ์„ค์ •์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ
null ๊ฒ€์‚ฌ์— undefined๋ฅผ ํฌํ•จํ• ์ง€ ์—ฌ๋ถ€์™€ ๋ฐฉ๋ฒ•
๊ทธ๊ฒƒ์€ ์‚ฌ์†Œํ•œ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž์ „๊ฑฐ๋ฅผ ํƒ€๊ณ  ๊ฐ€๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
์ฒ˜์Œ?

๋‚˜๋Š” nullable์ด ์•„๋‹Œ ์œ ํ˜•์œผ๋กœ TS 1.5์˜ ํฌํฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
์˜์™ธ๋กœ ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‘ ๊ฐ€์ง€ ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ณต์‹ TS ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ๊ฐ€์ง€๋ ค๋ฉด ํ•ฉ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ๋ช…ํ™•ํ•œ ๊ฒฐ๋ก  ์—†์ด ์œ„์—์„œ ๊ธธ๊ฒŒ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. undefined๋กœ ๋ฌด์—‡์„ ํ•ฉ๋‹ˆ๊นŒ? (๋‚ด ์ƒ๊ฐ: ์—ฌ์ „ํžˆ ๋„์ฒ˜์—
    ๋ฐ ์„ ํƒ ์ทจ์†Œ)
  2. ํŠนํžˆ ๊ธฐ์กด ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?
    ์ •์˜? (๋‚ด ์˜๊ฒฌ: ์ตœ์†Œํ•œ ์ •์˜ ํŒŒ์ผ๋‹น ์˜ตํŠธ์ธ ํ”Œ๋ž˜๊ทธ.
    ํ”Œ๋ž˜๊ทธ๋ฅผ ์ผœ๋Š” ๊ฒƒ์€ null์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "์ค‘๋‹จ"์ž…๋‹ˆ๋‹ค.
    ์ฃผ์„.)

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -138641395
.

@jods4 ๊ท€ํ•˜์˜ ํฌํฌ๊ฐ€ ๋ช…์‹œ์  nullable์ด ์•„๋‹Œ ์œ ํ˜• ์ฃผ์„์„ ์š”๊ตฌํ•˜๋Š” ๋Œ€์‹  ๊ธฐ๋ณธ์ ์œผ๋กœ non-nullable ์œ ํ˜•์„ ์œ ์ถ”ํ•œ๋‹ค๋Š” ์  2์—์„œ ๊ฐ€์ ธ

๋งํฌ ๋ถ€ํƒ๋“œ๋ ค๋„ ๋ ๊นŒ์š”? ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@impinball
undefined ์— ๋Œ€ํ•œ (์ผ๋ถ€) ์•ˆ์ „๋„ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ์ƒ๋‹นํžˆ ๋งŒ์—ฐํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ nullable์ด ์•„๋‹Œ ์œ ํ˜•์˜ ๋ฐฐ์—ด์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ(๋˜๋Š” ํฌ์†Œํ•œ) ๋ฐฐ์—ด ์•ก์„ธ์Šค๊ฐ€ undefined ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด ๋ฐฐ์—ด์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๋ชจ๋“  ๋ฐฐ์—ด์ด null์„ ํ—ˆ์šฉํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋„ˆ๋ฌด ๋งŽ์€ ๋ถ€๋‹ด์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

null ๋ฐ undefined ์œ ํ˜•์„ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค: T | null , T | undefined , T | null | undefined ์œ„์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์‰ฌ์šด ๋Œ€๋‹ต์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์†๊ธฐ ๊ตฌ๋ฌธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? T? ๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? null๊ณผ undefined ๋ชจ๋‘? ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์†๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

@์•„๋ฅด๋‚˜๋น„์˜จ
Null ๋ฐ Undefined ์œ ํ˜•์ด ์ด๋ฏธ TS์— ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ์ƒ๊ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  ์œ ํ˜•์„ nullable์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(์ถ”๋ก ๋œ ์œ ํ˜• ํฌํ•จ).
  2. null ์œ ํ˜•์— ์œ ํ˜• ์„ ์–ธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„( null )์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. null ์—์„œ any ํ™•์žฅ ์ œ๊ฑฐ ;
  4. T | null ์™€ ๋™์ผํ•œ ๊ตฌ๋ฌธ ์†๊ธฐ T? T | null ;
  5. null ์—์„œ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ์˜ ์•”์‹œ์  ๋ณ€ํ™˜์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ์—†์œผ๋ฉด ๊ทธ๊ฒƒ์ด ์š”์ง€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ Null ์œ ํ˜•๊ณผ ๋ฉ‹์ง„ TS ์œ ํ˜• ์‹œ์Šคํ…œ(ํŠนํžˆ Union ์œ ํ˜• ๋ฐ ์œ ํ˜• ๊ฐ€๋“œ)์ด ๋‚˜๋จธ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์•„์ง github์—์„œ ์ž‘์—…์„ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ ๋งํฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ ์Šค์œ„์น˜๋ฅผ ๋จผ์ € ์ฝ”๋”ฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ์ผ๋กœ ๋งค์šฐ ๋ฐ”๋นด์Šต๋‹ˆ๋‹ค :(
ํ˜ธํ™˜์„ฑ ์Šค์œ„์น˜๋Š” ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค <_<. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ ๋‹น์žฅ์€ TS ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŽ์€ ์˜ค๋ฅ˜๋กœ ์ž์ฒด ์ปดํŒŒ์ผ๋˜๊ณ  ๋งŽ์€ ๊ธฐ์กด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ์ƒˆ๋กœ์šด ์ฝ”๋“œ์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋Œ€ํ™”๊ฐ€ ์„œํด์—์„œ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ์ผ๋ถ€ ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๋กœ๋ถ€ํ„ฐ ๋ณธ ๊ฒƒ์„ ์š”์•ฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ: ํŠน์ • 'ํŠน์ˆ˜ ์‚ฌ๋ก€' ๊ฐ’์€ ์–ธ์–ด์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•(์˜ˆ: null ๋ฐ undefined)๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜: ๊ทธ๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ‘œ์ค€์„ ์„ธ์šฐ๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
๊ธฐํƒ€: ์˜๋„๊ฐ€ ํƒ€์ดํ•‘์— ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ž‘์—…ํ•˜๋Š” ๋ชจ๋“  ํŒ€์—์„œ ๋‹ค๋ฅด๊ฒŒ ๋ฌธ์„œํ™”๋˜์ง€ ์•Š๊ณ  ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ๊ฐ€์ •์ด ๋œ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
Everone: ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ์š”?
๊ธฐํƒ€: null์„ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜์—ฌ undefined๋ฅผ ์ฒ˜๋ฆฌํ•ฉ์‹œ๋‹ค!

undefined๊ฐ€ null๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ฌธ์ œ์ผ ๋•Œ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค!

๋ฉด์ฑ… ์กฐํ•ญ: ์ด๊ฒƒ์€ ์—ฌ๊ธฐ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ํƒœ๋„๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์—ˆ์„ ์ •๋„๋กœ ์ถฉ๋ถ„ํžˆ ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๋ฐ›์•„๋“ค์—ฌ์งˆ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ์˜ ์ž‘์€ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋Œ• ํฐ!
*์—ฌ๋Ÿฌ๋ถ„

* ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์„ ์ •๋„๋กœ ์˜ฌ๋ผ์™”์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์€ "์ด ์ œ์•ˆ์˜ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•"์œผ๋กœ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jods4 ํŠน์ • ๊ตฌ์„ฑ์— ๋”ฐ๋ผ

declare const list: T![];

for (const entry of list) {
  // `entry` is clearly immutable here.
}

list.forEach(entry => {
  // `entry` is clearly immutable here.
})

list.map(entry => {
  // `entry` is clearly immutable here.
})

์ด ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฐฐ์—ด์ด ๋ฒ”์œ„ ๋‚ด์—์„œ ํ™•์ธ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋งŽ์€ ๋…ผ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

declare const list: T![]

for (let i = 0; i < list.length; i++) {
  // This could potentially fail if the compiler doesn't correctly do the static bounds check.
  const entry: T![] = list[i];
}

๊ทธ๋ฆฌ๊ณ  ์ด ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ฅผ ํ‰๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ entry ๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ์•ก์„ธ์Šค๊ฐ€ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

declare const list: T![]

const end = round(max, list.length);

for (let i = 0; i < end; i++) {
  const entry: T![] = list[i];
}

์‰ฝ๊ณ  ๋ถ„๋ช…ํ•œ ๊ฒƒ๋„ ์žˆ์ง€๋งŒ ๋” ์–ด๋ ค์šด ๊ฒƒ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@impinball ์‹ค์ œ๋กœ map , forEach ๋˜๋Š” for..of ์™€ ๊ฐ™์€ ์ตœ์‹  API๋Š” ์ดˆ๊ธฐํ™”๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. (์—ฌ๊ธฐ์—๋Š” undefined ๋กœ ์„ค์ •๋œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์ง€๋งŒ ๊ฐ€์ƒ์˜ null-safe TS๋Š” ์ด๋ฅผ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๊ณ ์ „์ ์ธ ๋ฐฐ์—ด ์•ก์„ธ์Šค๋Š” ์ค‘์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋ฉฐ ์ด์— ๋Œ€ํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ ๋ณต์žกํ•œ ๋ถ„์„์„ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์†Œํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ถ„๋ช…ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์€ ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ i < array.length ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋”๋ผ๋„ ์š”์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค. TS๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

let array: T![] = [];  // an empty array of non-null, non-undefined T
// blah blah
array[4] = new T();  // Fine for array[4], but it means array[0..3] are undefined, is that OK?
// blah blah
let i = 2;
// Note that we could have an array bounds guard
if (i < array.length) {
  let t = array[i];  // Inferred type would be T!, but this is actually undefined :(
}

Object.defineProperty์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

let array = new Array(5)
Object.defineProperty(array, "length", 2, {
  get() { return 10 },
})

2015๋…„ 9์›” 9์ผ ์ˆ˜์š”์ผ 17:49 jods [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@impinball https://github.com/impinball ์‹ค์ œ๋กœ ์ง€๋„์™€ ๊ฐ™์€ ์ตœ์‹  API,
forEach ๋˜๋Š” for..of๋Š” ์ด์ „์— ์—†์—ˆ๋˜ ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
์ดˆ๊ธฐํ™”๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ์œผ๋กœ ์„ค์ •๋œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
์ •์˜๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ๊ฐ€์„ค์ ์ธ null-safe TS๋Š” ๊ทธ๊ฒƒ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๊ณ ์ „์ ์ธ ๋ฐฐ์—ด ์•ก์„ธ์Šค๋Š” ์ค‘์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋ฉฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ด์— ๋Œ€ํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ œ์•ˆํ•œ ๋Œ€๋กœ ๋ณต์žกํ•œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€
์‚ฌ์†Œํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ถ„๋ช…ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋“ค์€ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ <
array.length ์š”์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค. TS๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

let ๋ฐฐ์—ด: T![] = []; // null์ด ์•„๋‹Œ ์ •์˜๋˜์ง€ ์•Š์€ ๋นˆ ๋ฐฐ์—ด T// blah blah
๋ฐฐ์—ด[4] = ์ƒˆ๋กœ์šด T(); // array[4]๋Š” ๊ดœ์ฐฎ์ง€๋งŒ array[0..3]์ด ์ •์˜๋˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?// blah blahlet i = 2;// ๋ฐฐ์—ด ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.guardif (i < array. ๊ธธ์ด) {
ํ•˜์ž t = ๋ฐฐ์—ด[i]; // ์ถ”๋ก ๋œ ์œ ํ˜•์€ T!์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
}

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -139055786
.

๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  1. Null ๋ฐ Undefined ์œ ํ˜•์„ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.
  2. null ๋ฐ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ฌด์—‡์ด๋“  ํ• ๋‹นํ•  ์ˆ˜ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  3. Null ํ—ˆ์šฉ ์—ฌ๋ถ€๊ฐ€ ์•”์‹œ๋˜๋Š” ๊ฒฝ์šฐ Null ๋ฐ/๋˜๋Š” Undefined์™€ ํ•จ๊ป˜ ๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์œผ๋กœ ๊ณผ๊ฐํ•œ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€์ด๋ฉฐ ์–ธ์–ด์— ๋” ์ ํ•ฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.
ํ™•๋Œ€.
2015๋…„ 9์›” 10์ผ ์˜ค์ „ 9์‹œ 13๋ถ„์— "Isiah Meadows" [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Object.defineProperty์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

let array = new Array(5)
Object.defineProperty(array, "length", 2, {
get() { return 10 },
})

2015๋…„ 9์›” 9์ผ ์ˆ˜์š”์ผ 17:49 jods [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@impinball https://github.com/impinball ์‹ค์ œ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ตœ์‹  API๋Š”
์ง€๋„,
forEach ๋˜๋Š” for..of๋Š” ์ด์ „์— ์—†์—ˆ๋˜ ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
์ดˆ๊ธฐํ™”๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ์œผ๋กœ ์„ค์ •๋œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
์ •์˜๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ๊ฐ€์„ค์ ์ธ null-safe TS๋Š” ๊ทธ๊ฒƒ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๊ณ ์ „์ ์ธ ๋ฐฐ์—ด ์•ก์„ธ์Šค๋Š” ์ค‘์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋ฉฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ด์— ๋Œ€ํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ œ์•ˆํ•œ ๋Œ€๋กœ ๋ณต์žกํ•œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€
์‚ฌ์†Œํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ถ„๋ช…ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋“ค์€ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ <
array.length ์š”์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค. TS๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

let ๋ฐฐ์—ด: T![] = []; // null์ด ์•„๋‹Œ ์ •์˜๋˜์ง€ ์•Š์€ ๋นˆ ๋ฐฐ์—ด T//
์ด๋Ÿฌ์ฟต ์ €๋Ÿฌ์ฟต
๋ฐฐ์—ด[4] = ์ƒˆ๋กœ์šด T(); // array[4]๋Š” ๊ดœ์ฐฎ์ง€๋งŒ array[0..3]์€
undefined, ๊ดœ์ฐฎ๋‚˜์š”?// blah blahlet i = 2;//
๋ฐฐ์—ด ๊ฒฝ๊ณ„ ๊ฐ€๋“œif (i < array.length) {
ํ•˜์ž t = ๋ฐฐ์—ด[i]; // ์ถ”๋ก ๋œ ์œ ํ˜•์€ T!์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š”
์ฐพ์œผ์‹œ๋Š” ์ฃผ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค :(
}

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
<
https://github.com/Microsoft/TypeScript/issues/185#issuecomment-139055786>
.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -139230568
.

@impinball
๋‚˜๋Š” ๋‹น์‹ ์˜ ๋ชจ๋ฒ”์— ๋Œ€ํ•ด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ defineProperty ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ TS ์•ˆ์ „ ์ƒ์ž๋ฅผ ๋ฒ—์–ด๋‚˜ ๋™์  JS ์˜์—ญ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‚˜์š”? TS ์ฝ”๋“œ์—์„œ ์ง์ ‘ defineProperty ํ˜ธ์ถœํ•œ ์ ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@aleksey-bykov

์–ธ์–ด ํ™•์žฅ์— ๋” ์ ํ•ฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์˜ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋„๋ฆฌ ๋ฐ›์•„๋“ค์—ฌ์ง€์ง€ ์•Š์œผ๋ฉด ๊ฐ€์น˜๊ฐ€ ๋–จ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ฒฐ๊ตญ, ์šฐ๋ฆฌ๋Š” ์—…๋ฐ์ดํŠธ๋œ TS ์ •์˜๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ด๊ฒƒ์ด TS์˜ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜, ํ˜ธํ™˜๋˜์ง€ ์•Š๊ฑฐ๋‚˜, ํ™•์žฅ๋˜๊ฑฐ๋‚˜ ๋ถ„๊ธฐ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

IIRC๊ฐ€ ๋˜์ง€๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜•์ด ์ง€์ •๋œ ๋ฐฐ์—ด์—๋Š” ๋ณด์ฆ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋ฐฐ์—ด ๋กœ๋“œ ๋ฐ ์ €์žฅ์— ๋Œ€ํ•œ ReferenceError์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๋ฐฐ์—ด ๋ฐ
์ธ๋ฑ์Šค๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ arguments ๊ฐ์ฒด๋Š” undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด
์˜๊ฒฌ, ๊ทธ๊ฒƒ์€ JS ์–ธ์–ด ๊ฒฐํ•จ์ด์ง€๋งŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค.
์›น์„ ๊นจ๋‹ค.

์ด๊ฒƒ์„ "์ˆ˜์ •"ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ํ”„๋ก์‹œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ES6์— ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๋ฐ ์ž์ฒด ํ”„๋กœํ† ํƒ€์ž…์ด ์›๋ž˜ Array๋กœ ์„ค์ •๋จ
๊ฑด์„ค์ž. ์ด ๊ฐ™์€:

Array = (function (A) {
  "use strict";
  function check(target, prop) {
    const i = +prop;
    if (prop != i) return target[prop];
    if (i >= target.length) {
      throw new ReferenceError();
    }
    return i;
  }

  function Array(...args) {
    return new Proxy(new Array(...args), {
      get(target, prop) {
        return target[check(target, prop)];
      },
      set(target, prop, value) {
        return target[check(target, prop)] = value;
      },
    });
  }

  Array.prototype = A.prototype;
  Array.prototype.constructor = Array
  Object.setPrototypeOf(Array, A);
  return Array;
})(Array);

(์ฐธ๊ณ : ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ „ํ™”๋กœ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค...)

2015๋…„ 9์›” 10์ผ ๋ชฉ์š”์ผ 10:09 jods [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@impinball https://github.com/impinball
๋‚˜๋Š” ๋‹น์‹ ์˜ ๋ชจ๋ฒ”์— ๋Œ€ํ•ด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ defineProperty๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€
TS ์•ˆ์ „ ์ƒ์ž๋ฅผ ๋ฒ—์–ด๋‚˜ ๋™์  JS ์˜์—ญ์œผ๋กœ ๋“ค์–ด๊ฐ€์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
๋‹น์‹ ์€ ์ƒ๊ฐ? TS ์ฝ”๋“œ์—์„œ ์ง์ ‘ defineProperty๋ฅผ ํ˜ธ์ถœํ•œ ์ ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@aleksey-bykov https://github.com/aleksey-bykov

์–ธ์–ด ํ™•์žฅ์— ๋” ์ ํ•ฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์˜ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋„๋ฆฌ ๋ฐ›์•„๋“ค์—ฌ์ง€์ง€ ์•Š๋Š” ํ•œ
๊ฐ€์น˜๊ฐ€ ๋–จ์–ด์กŒ์Šต๋‹ˆ๋‹ค.
๊ฒฐ๊ตญ, ์šฐ๋ฆฌ๋Š” ์—…๋ฐ์ดํŠธ๋œ TS ์ •์˜๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ๊ทธ๋Ÿด ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
TS์˜ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜, ํ˜ธํ™˜๋˜์ง€ ์•Š๊ฑฐ๋‚˜, ํ™•์žฅ๋˜๊ฑฐ๋‚˜ ๋ถ„๊ธฐ๋˜๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -139245706
.

@impinball ์ฒ˜์Œ์— "์ˆ˜์ •"ํ•  ๊ฒƒ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...
๊ทธ๊ฒƒ๋“ค์€ JS์˜ ์˜๋ฏธ์ด๊ณ  TS๋Š” ์–ด๋–ป๊ฒŒ๋“  ๊ทธ๊ฒƒ๋“ค์„ ์ˆ˜์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํฌ์†Œ ๋ฐฐ์—ด๊ณผ ๋น„ํฌ์†Œ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด (์•ฝ๊ฐ„ ๋‹ค๋ฅธ) ๋งˆํฌ์—…์ด ์žˆ๊ณ  ํฌ์†Œ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๋ฐฐ์—ด์ด ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”(ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๊ฐ’์ด๋‚˜ ๋ฐฉ์ •์‹์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Œ). ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํฌ์†Œ ๋ฐฐ์—ด์ด T|undefined ์œ ํ˜•์ด ๋˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๊ณ (for... of ๋ฐ ๊ธฐํƒ€ '์•ˆ์ „ํ•œ' ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• T๋กœ ๋ณ€๊ฒฝ๋จ) ํฌ์†Œ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๋ฐฐ์—ด์˜ ์œ ํ˜•์€ ๊ทธ๋Œ€๋กœ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

//not-sparse
var array = [arrlength] => index*3;
var array = <number[]>[3];
//sparse
var array = [];

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ์ตœ์ข… ๊ตฌ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ ์˜ˆ๋Š” ๋ชจ๋“  ๊ฐ’์„ ํ•ด๋‹น ์œ ํ˜•์˜ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ํฌ์†Œ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฐฐ์—ด์„ ์ž…๋ ฅํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”๋œ ํ›„์— ๋ฐฐ์—ด์„ ์บ์ŠคํŠธํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฐฐ์—ด์„ non-sparse๋กœ ์บ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐฐ์—ด์— ๋Œ€ํ•ด non-sparse ์œ ํ˜•์ด ํ•„์š”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@๊ทธ๋ฆฌํฌํฌ
๋ชฐ๋ผ์š”... ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํฌ์†Œ ๋ฐฐ์—ด์ด T|undefined ์œ ํ˜•์ด ๋˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(for... of ๋ฐ ๊ธฐํƒ€ '์•ˆ์ „ํ•œ' ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• T๋กœ ๋ณ€๊ฒฝ๋จ).

JS์˜ ๋‹จ์  ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. let arr: (T|undefined)[] ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ €๋Š” arr[0] = undefined ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด "์•ˆ์ „ํ•œ"๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์Šฌ๋กฏ์— ๋Œ€ํ•ด undefined ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ arr.forEach(x => ...) ์—์„œ๋Š” x: T ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ x: T|undefined ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜ˆ๋Š” ๋ชจ๋“  ๊ฐ’์„ ํ•ด๋‹น ์œ ํ˜•์˜ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •์‹ ์ด ๊ทธ๋‹ค์ง€ TS์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ TS ์ฒ ํ•™์€ ์œ ํ˜•์ด JS ์ƒ๋‹จ์˜ ์ถ”๊ฐ€ ๊ณ„์ธต์ผ ๋ฟ์ด๋ฉฐ codegen์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋ณ„๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์  ์œ ํ˜• ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

TS๋Š” ๋ถ„๋ช…ํžˆ JS์˜ ๋ชจ๋“  ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์œ ํšจํ•œ TS์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•จ์ˆ˜/๊ตฌ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๊ฐœ์ฒด์˜ ๋Ÿฐํƒ€์ž„ ์œ ํ˜•์— ๋™์  ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ์ •์  TS ์œ ํ˜• ๋ถ„์„์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๊ตฌ๋ฉ์ด๋ผ๋ฉด ๋‚˜์ ๊นŒ์š”? ๋‚ด ๋ง์€, ์ด ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค: let x: number[] = []; x[3] = 0; ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ํ•˜๊ณ  ์‹ถ์€ ์ข…๋ฅ˜์˜ ์ผ์ด๋ผ๋ฉด ๋ฐฐ์—ด์„ let x: number?[] ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์‹ค์ œ ์‚ฌ์šฉ์— ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ์‚ฌ์šด๋“œ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์›ํ•˜๋Š” ์ˆœ์ˆ˜์ฃผ์˜์ž๋ผ๋ฉด, TS ํƒ€์ž… ์‹œ์Šคํ…œ์€ ์–ด์จŒ๋“  ์‚ฌ์šด๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™•์‹คํžˆ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํฌ์†Œ ๋ฐฐ์—ด๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์œ ํ˜•์ด๋ฏ€๋กœ ์„ฑ๋Šฅ ์—†์ด ์ง์ ‘ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ํ–ฅ.
๋‚˜๋Š” ํฌ๋ฐ•ํ•œ ๊ฒƒ ์‚ฌ์ด์˜ ๊ตฌ๋ณ„์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์œ ํ˜•๋ณ„ ๋ฐฐ์—ด ๋ฐ ๋น„ํฌ์†Œ ๋ฐฐ์—ด.

์ด๊ฒƒ์ด ์™œ ์ค‘์š”ํ•œ์ง€ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด, ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด
T ์™€ T|null ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

2015๋…„ 9์›” 11์ผ ๊ธˆ์š”์ผ ์˜ค์ „ 9์‹œ 11๋ถ„์— jods [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@Griffork https://github.com/Griffork
๋ชฐ๋ผ์š”... ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํฌ์†Œ ๋ฐฐ์—ด์„ T|undefined ์œ ํ˜•์œผ๋กœ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Š”
for... of ๋ฐ ๊ธฐํƒ€ '์•ˆ์ „ํ•œ' ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• T๋กœ ๋ณ€๊ฒฝ)

JS์˜ ๋‹จ์  ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
(|์ •์˜๋˜์ง€ ์•Š์Œ)[].
๊ทธ๋ž˜์„œ ์ €๋Š” ์ž์œ ๋กญ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. arr[0] = undefined.
๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด "์•ˆ์ „ํ•œ"๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ _will_ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ์Šฌ๋กฏ์˜ ๊ฒฝ์šฐ. ๋”ฐ๋ผ์„œ arr.forEach(x => ...)์—์„œ x: T๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์—ฌ์ „ํžˆ x: T|undefined์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜ˆ๋Š” ๋ชจ๋“  ๊ฐ’์„ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ์œ ํ˜•์„ ์œ„ํ•ด.

์ด๊ฒƒ์€ ์ •์‹ ์ด ๊ทธ๋‹ค์ง€ TS์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ณด์ธ๋‹ค
TS ์ฒ ํ•™์€ ์œ ํ˜•์ด JS ์œ„์— ์ถ”๊ฐ€๋œ ๋ ˆ์ด์–ด์ผ ๋ฟ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ codegen์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋ณ„๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์œ ํ˜• ์ •ํ™•์„ฑ.

TS๋Š” ๋ถ„๋ช…ํžˆ JS์˜ ๋ชจ๋“  ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์œ ํšจํ•œ TS์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ/๊ตฌ์„ฑ
๊ฐœ์ฒด์˜ ๋Ÿฐํƒ€์ž„ ์œ ํ˜•์— ๋Œ€ํ•œ ๋™์  ํšจ๊ณผ ๋ฐ ์ •์  TS ์ค‘๋‹จ
์œ ํ˜• ๋ถ„์„.

์ด๊ฒƒ์ด ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๊ตฌ๋ฉ์ด๋ผ๋ฉด ๋‚˜์ ๊นŒ์š”? ๋‚ด ๋ง์€, ์ด ์ฝ”๋“œ๋Š”
์ •๋ง ํ”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: let x: number[] = []; x[3] = 0; ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ์žˆ๋‹ค๋ฉด
๋‹น์‹ ์ดํ•˜๊ณ  ์‹ถ์€ ์ผ์˜ ์ข…๋ฅ˜๋Š” ์•„๋งˆ๋„ ๋‹น์‹ ์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค let
x: ์ˆซ์ž?[].

์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์‹ค์ œ ์‚ฌ์šฉ์— ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šด๋“œ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์›ํ•˜๋Š” ์ˆœ์ˆ˜์ฃผ์˜์ž๋ผ๋ฉด ๋ฐ˜๋“œ์‹œ
TSํ˜• ์‹œ์Šคํ…œ์€ ์–ด์จŒ๋“  ์†Œ๋ฆฌ๊ฐ€ ๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ๋ณด์„ธ์š”. ๋ญ
๋‹น์‹ ์€ ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -139408240
.

@jods4 ๋‚ด๊ฐ€ "์ˆ˜์ •"ํ•œ๋‹ค๋Š” ๊ฒƒ์€ JS ์–ธ์–ด ์„ค๊ณ„ ๊ฒฐํ•จ์ธ IMHO๋ฅผ "์ˆ˜์ •"ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. TypeScript๊ฐ€ ์•„๋‹ˆ๋ผ _JavaScript ์ž์ฒด_์— ์žˆ์Šต๋‹ˆ๋‹ค.

@jods ์ €๋Š” TS๊ฐ€ ์•„๋‹ˆ๋ผ JS์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์ œ๋„˜์€๊ฑฐ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค.

2015๋…„ 9์›” 10์ผ ๋ชฉ์š”์ผ 19:19 Griffork [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํฌ์†Œ ๋ฐฐ์—ด๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์œ ํ˜•์ด๋ฏ€๋กœ ์„ฑ๋Šฅ ์—†์ด ์ง์ ‘ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ํ–ฅ.
๋‚˜๋Š” ํฌ๋ฐ•ํ•œ ๊ฒƒ ์‚ฌ์ด์˜ ๊ตฌ๋ณ„์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์œ ํ˜•๋ณ„ ๋ฐฐ์—ด ๋ฐ ๋น„ํฌ์†Œ ๋ฐฐ์—ด.

์ด๊ฒƒ์ด ์™œ ์ค‘์š”ํ•œ์ง€ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด, ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด
T ์™€ T|null ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

2015๋…„ 9์›” 11์ผ ๊ธˆ์š”์ผ ์˜ค์ „ 9์‹œ 11๋ถ„์— jods [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@Griffork https://github.com/Griffork
๋ชฐ๋ผ์š”... ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํฌ์†Œ ๋ฐฐ์—ด์„ T|undefined ์œ ํ˜•์œผ๋กœ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Š”
for... of ๋ฐ ๊ธฐํƒ€ '์•ˆ์ „ํ•œ' ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• T๋กœ ๋ณ€๊ฒฝ)

JS์˜ ๋‹จ์  ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
(|์ •์˜๋˜์ง€ ์•Š์Œ)[].
๊ทธ๋ž˜์„œ ์ €๋Š” ์ž์œ ๋กญ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. arr[0] = undefined.
๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด "์•ˆ์ „ํ•œ"๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ _will_ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ์Šฌ๋กฏ์˜ ๊ฒฝ์šฐ. ๋”ฐ๋ผ์„œ arr.forEach(x => ...)์—์„œ x: T๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์—ฌ์ „ํžˆ x: T|undefined์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜ˆ๋Š” ๋ชจ๋“  ๊ฐ’์„ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ์œ ํ˜•์„ ์œ„ํ•ด.

์ด๊ฒƒ์€ ์ •์‹ ์ด ๊ทธ๋‹ค์ง€ TS์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ณด์ธ๋‹ค
๊ทธ TS ์ฒ ํ•™์€ ์œ ํ˜•์€
JS
๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ codegen์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋ณ„๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์œ ํ˜• ์ •ํ™•์„ฑ.

TS๋Š” ๋ถ„๋ช…ํžˆ JS์˜ ๋ชจ๋“  ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž๋ฅผ ๋ณดํ˜ธํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์œ ํšจํ•œ TS์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ/๊ตฌ์„ฑ
๊ฐ€์ง€๋‹ค
๊ฐœ์ฒด์˜ ๋Ÿฐํƒ€์ž„ ์œ ํ˜•์— ๋Œ€ํ•œ ๋™์  ํšจ๊ณผ ๋ฐ ์ •์  TS ์ค‘๋‹จ
์œ ํ˜• ๋ถ„์„.

์ด๊ฒƒ์ด ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๊ตฌ๋ฉ์ด๋ผ๋ฉด ๋‚˜์ ๊นŒ์š”? ๋‚ด ๋ง์€, ์ด ์ฝ”๋“œ๋Š”
์ •๋ง ํ”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: let x: number[] = []; x[3] = 0; ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ์žˆ๋‹ค๋ฉด
๋‹น์‹ ์ดํ•˜๊ณ  ์‹ถ์€ ์ผ์˜ ์ข…๋ฅ˜๋Š” ์•„๋งˆ๋„ ๋‹น์‹ ์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค
ํ—ˆ๋ฝํ•˜๋‹ค
x: ์ˆซ์ž?[].

์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์‹ค์ œ ์‚ฌ์šฉ์— ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šด๋“œ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์›ํ•˜๋Š” ์ˆœ์ˆ˜์ฃผ์˜์ž๋ผ๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ‹€๋ฆผ์—†์ด
TSํ˜• ์‹œ์Šคํ…œ์€ ์–ด์จŒ๋“  ์†Œ๋ฆฌ๊ฐ€ ๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ๋ณด์„ธ์š”.
๋ญ
๋‹น์‹ ์€ ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
<
https://github.com/Microsoft/TypeScript/issues/185#issuecomment-139408240>
.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -139409349
.

๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด ๊ธธ์ด๊ฐ€ ์žˆ๋Š” ๋‚ด ๋ช…๋ น๋ฌธ์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐฐ์—ด ์•ก์„ธ์Šค๊ฐ€ ๊ฒฝ๊ณ„ ๋‚ด์— ์žˆ๊ณ  ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚œ ์•ก์„ธ์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •๋˜์ง€ ์•Š๋Š” ํ•œ ์ •์˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” C/C++๊ฐ€ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฉฐ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฒฐ๊ตญ ์–ธ์–ด ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š” ํƒ€์‚ฌ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ๋” ๋‚˜์€ ํƒ€์ดํ•‘๊ณผ ์ž ์žฌ์ ์œผ๋กœ ์ „์ฒด ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™” ๋ถ€ํ•˜๋ฅผ ๋ชจ๋‘ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ์ถœ์„ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.

์ผ์น˜ํ•˜๋Š” C/C++ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ๋งค์šฐ ์–ด๋ฆฌ์„์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์•ก์„ธ์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‹ค์ œ๋กœ _๋” ๋‚˜์€_ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ๋“œ๋ญ…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณธ ์‚ฌ์šฉ ์ค‘ 99.99%๋Š” ๋งค์šฐ ์ž๊ทน์ ์ธ ์ฝ”๋“œ ๋ƒ„์ƒˆ์ด๋ฉฐ ๊ฑฐ์˜ ํ•ญ์ƒ JavaScript์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

(๋‚ด ๊ฒฝํ—˜์ƒ ์ด ์‚ฌ๋žŒ๋“ค ๋Œ€๋ถ€๋ถ„์€ TypeScript๋Š” ๋ฌผ๋ก ์ด๊ณ  CoffeeScript์— ๋Œ€ํ•ด์„œ๋„ ๋“ค์–ด๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ๋ง‰ ์™„์„ฑ๋˜๊ณ  ํ‘œ์ค€ํ™”๋œ ES2015์˜ ์ƒˆ ๋ฒ„์ „์ธ JS์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

์ด์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” _assuredly_ null์ธ ๋ณ€์ˆ˜์˜ ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ํ•˜๋ฉด TypeScript๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

var o = null;
console.log(o.x);

... ์‹คํŒจํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฐฐ์—ด ์•ก์„ธ์Šค๊ฐ€ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋˜๋„๋ก ์œ ํ˜• ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์ข…์† ์œ ํ˜•์˜ ์˜์—ญ์œผ๋กœ ํ‘œ๋ฅ˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ข…์† ์œ ํ˜•์€ ๊ฝค ๊น”๋”ํ•˜์ง€๋งŒ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•๋ณด๋‹ค ํ›จ์”ฌ ๋” ํฐ ๊ธฐ๋Šฅ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฐฐ์—ด์— ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์„ธ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ(๋ฐ ์ธ๋ฑ์Šค์— ์˜ํ•œ ์ž„์˜์˜ ๋ฐฐ์—ด ์š”์†Œ ์•ก์„ธ์Šค)์€ nullable์ด ์•„๋‹Œ ํ˜•์‹์˜ ๋ฐฐ์—ด์—์„œ๋„ nullable ํ˜•์‹์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ [] "method" ์—๋Š” T? ์˜ ์œ ํ˜• ์„œ๋ช…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ ์ธ๋ฑ์‹ฑ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ T? ๋ฅผ T! ๋กœ ์บ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ์€ ๋ฐฐ์—ด์˜ ์ผ๋ฐ˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์œ ํ˜•(๋™์ผํ•œ null ํ—ˆ์šฉ ์—ฌ๋ถ€ ํฌํ•จ)์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๋ชจ๋“  ๋ฐฐ์—ด ์•ก์„ธ์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฒฝ๊ณ„๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์•ก์„ธ์Šค๋Š” undefined ๋ฐ˜ํ™˜ํ•˜๊ณ  ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ์— ์˜ํ•ด ํฌ์ฐฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ํ•ต ์˜ต์…˜: ๋ชจ๋“  ๋ฐฐ์—ด์€ ์–ธ์–ด์— nullable๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์œผ๋ฉฐ nullable์ด ์•„๋‹Œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๊ฐ์ฒด์˜ ์†์„ฑ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด object['property'] ์—ฌ๊ธฐ์„œ object ๋Š” { [ key: string ]: T! } ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ธ๋ฑ์‹ฑ์ด nullable ํ˜•์‹์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์กฐ์ฐจ๋„ ํ˜„์žฌ ์ƒํ™ฉ์ธ nullable์ธ ๋ชจ๋“  ๊ฒƒ๋ณด๋‹ค ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ต ์˜ต์…˜์€ ์ด์ฒด์ ์ด์ง€๋งŒ ์ •์งํ•˜๊ฒŒ๋„ ์—ฌ์ „ํžˆ ๋ชจ๋“  ๊ฒƒ์ด ๋ฌดํšจํ™”๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

์œ ํ˜•์ด ๊ธฐ๋ณธ์ ์œผ๋กœ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š”์ง€ ๋˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ null์„ ํ—ˆ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‘ ๋ฒˆ์งธ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์ œ๋„ค๋ฆญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ช…์‹œ์ ์œผ๋กœ nullable ๋ฐ ๋ช…์‹œ์ ์œผ๋กœ non-nullable ํ˜•์‹ ๋ชจ๋‘์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ปจํ…Œ์ด๋„ˆ ํด๋ž˜์Šค(์˜ˆ: Map)์—์„œ get ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ์ด ๋ฉ”์„œ๋“œ๋Š” _์ปจํ…Œ์ด๋„ˆ์— null ํ—ˆ์šฉ์ด ์•„๋‹Œ ๊ฐ’๋งŒ ํฌํ•จ๋œ ๊ฒฝ์šฐ์—๋„ ์ผ๋ถ€ ๊ฐ’์„ ์ทจํ•˜๊ณ  ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Container<K,V> {
  get(key: K): V? {
    // fetch from some internal data structure and return the value, if it exists
    // return null otherwise
  }
}

// only non-nullable values allowed in the container
const container = new Container<SomeKeyClass!, SomeValueClass!>();
const val: SomeValueClass!;
// ... later, we attempt to read from the container with a get() call
// even though only non-nullables are allowed in the container, the following should fail:
// get() explicitly returns null when the item can't be found
val = container.get(someKey);

์œ ์‚ฌํ•˜๊ฒŒ, ์šฐ๋ฆฌ๋Š” (์ด๊ฒƒ์€ ๋œ ๊ฐ•๋ ฅํ•œ ์ธ์ˆ˜์ž„) ์šฐ๋ฆฌ์˜ ์ปจํ…Œ์ด๋„ˆ ํด๋ž˜์Šค๊ฐ€ nullable ํ‚ค ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์‚ฝ์ž…์—์„œ null์ด ์•„๋‹Œ ํ‚ค๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ํ•˜๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Container<K, V> {
  insert(key: K!, val: V): void {
    // put the val in the data structure
    // the key must not be null here, even if K is elsewhere a nullable type
  }
}

const container = new Container<SomeKeyClass?, SomeValueClass>();
container.insert(null, new SomeValueClass()); // fails

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ๋ณ€๊ฒฝ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด nullable ํ˜•์‹๊ณผ nullable์ด ์•„๋‹Œ ํ˜•์‹ ๋ชจ๋‘์— ๋Œ€ํ•ด ๋ช…์‹œ์  ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ?

๋‘˜ ๋‹ค์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์ด ์žˆ๋Š” ์ง€์ ์—์„œ ๊ธฐ๋ณธ๊ฐ’์€ --noImplicitAny ์™€ ์œ ์‚ฌํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” 2.0 ๋ฆด๋ฆฌ์Šค๊นŒ์ง€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์— ํˆฌํ‘œํ•˜๊ณ  ์‹ถ์ง€๋งŒ ํƒˆ์ถœ๊ตฌ๊ฐ€ ์žˆ๋Š” ํ•œ(์ ์–ด๋„ ์ผ์‹œ์ ์œผ๋กœ) ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก ๊ทธ๊ฒƒ์ด ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚œ ์•ก์„ธ์Šค๋ฅผ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์œผ๋กœ ๋งŒ๋“ค๋”๋ผ๋„(TS ํƒ€์ดํ•‘์˜ ์˜์—ญ์—์„œ), ์ด๊ฒƒ์ด ์ด์— ๋Œ€ํ•œ ์ข‹์€ ์ ˆ์ถฉ์•ˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์†๋„๋ฅผ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์˜ˆ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ nullable ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ๋ฅผ nullable ํ˜•์‹์œผ๋กœ ์บ์ŠคํŒ…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(ํ•ญ์ƒ ๊ฐ€๋Šฅํ•จ). ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์—ด์ด nullable์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚œ ์•ก์„ธ์Šค๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ๋ฒ„๊ทธ์ด๋ฉฐ ์–ด๋Š ์‹œ์ ์—์„œ ๊ฒฉ๋ ฌํ•˜๊ฒŒ ๋ถ„์ถœํ•ด์•ผ ํ•˜๋Š” ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค(JS ๊ฒฐํ•จ์ž…๋‹ˆ๋‹ค).

ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฐ”๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹ ์•ˆ์ „์„ฑ์€ ๋–จ์–ด์ง€์ง€๋งŒ ์ด ๊ฒฝ์šฐ ํ˜•์‹ ์•ˆ์ „์„ฑ์ด ๋ฐฉํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ•ฉ๊ณ„ ํ•จ์ˆ˜๋ฅผ ์˜ˆ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์˜ต์…˜์„ ๋น„๊ตํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’์ด ๊ฐ€์žฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ).

// Option 1
function sum(numbers: !number[]) {
  let res = 0
  for (let i = 0; i < numbers.length; i++) {
    res += <!number> numbers[i]
  }
  return res
}

// Option 2
function sum(numbers: !number[]) {
  let res = 0
  for (let i = 0; i < numbers.length; i++) {
    res += numbers[i]
  }
  return res
}

// Option 3
function sum(numbers: number[]) {
  let res = 0
  for (let i = 0; i < numbers.length; i++) {
    res += <!number> numbers[i]
  }
  return res
}

๋˜ ๋‹ค๋ฅธ ์˜ˆ: map ํ•จ์ˆ˜.

// Option 1
function map<T>(list: !T[], f: (value: !T, index: !number) => !T): !T[] {
  let res: !T[] = []
  for (let i = 0; i < list.length; i++) {
    res.push(f(<!T> list[i], i));
  }
  return res
}

// Option 2
function map<T>(list: !T[], f: (value: !T, index: !number) => !T): !T[] {
  let res: !T[] = []
  for (let i = 0; i < list.length; i++) {
    res.push(f(list[i], i));
  }
  return res
}

// Option 3
function map<T>(list: T[], f: (value: !T, index: !number) => !T): T[] {
  let res: T[] = []
  for (let i = 0; i < list.length; i++) {
    const entry = list[i]
    if (entry !== undefined) {
      res.push(f(<!T> entry, i));
    }
  }
  return res
}

๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ: ๊ฐ๊ฐ์˜ entry ์œ ํ˜•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? !string , ?string ๋˜๋Š” string ?

declare const regularStrings: string[];
declare const nullableStrings: ?string[];
declare const nonnullableStrings: !string[];

for (const entry of regularStrings) { /* ... */  }
for (const entry of nullableStrings) { /* ... */  }
for (const entry of nonnullableStrings) { /* ... */  }

์„ธ ๋ฒˆ์งธ ์˜ต์…˜์€ ์•ฝ๊ฐ„์˜ ํ˜€๋ฅผ ์ฐจ๋Š” ๋“ฏํ•œ ์ œ์•ˆ์ด์—ˆ์Šต๋‹ˆ๋‹ค.stuck_out_tongue:

Re: ๋งˆ์ง€๋ง‰ ์งˆ๋ฌธ:

declare const regularStrings: string[];
declare const nullableStrings: string?[];
declare const nonNullableStrings: string![]; // fails typecheck in option three

for(const entry of regularStrings) {
  // option 1: entry is of type string?
  // option 2: depends on default nullability
}

for(const entry of nullableStrings) {
  // option 1 and 2: entry is of type string?
}

for(const entry of nonNullableStrings) {
  // option 1: entry is of type string?
  // option 2: entry is of type string!
}

์˜ˆ๋ฅผ ๋“ค์–ด nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฐฐ์—ด์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์ด ์—†์Œ์„ ๋ณด์žฅํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์˜ต์…˜ 1์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ์บ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์—์„œ (์ด ๋ณด์ฆ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์–ด๋–ค ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•˜๋“ ์ง€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉฐ as string! ๋ฉ๋‹ˆ๋‹ค.) ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋” ๋ช…์‹œ์ (์•”๋ฌต์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋กœ ์œ„ํ—˜ํ•œ ํ–‰๋™์„ ํ•  ๋•Œ ์ง€์ •ํ•ด์•ผ ํ•จ)๊ณผ ๋Œ€๋ถ€๋ถ„์˜ ์ปจํ…Œ์ด๋„ˆ ํด๋ž˜์Šค ์ž‘๋™ ๋ฐฉ์‹์— ๋” ์ผ๊ด€์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Map์˜ get ํ•จ์ˆ˜๋Š” ๋ถ„๋ช…ํžˆ nullable ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๊ณ (ํ‚ค ์•„๋ž˜์— ๊ฐœ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•จ) Map.prototype.get ๊ฐ€ nullable์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด object['property'] ๋Š” ์•„๋งˆ๋„ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. null ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ๋ณด์žฅ์„ ํ•˜๊ณ  ์œ ์‚ฌํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์€ null ์ฐธ์กฐ ์˜ค๋ฅ˜๊ฐ€ ๋‹ค์‹œ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ณ  ์ž„์˜ ์•ก์„ธ์Šค๊ฐ€ ์œ ํ˜• ์‹œ์Šคํ…œ์— ์˜ํ•ด null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ—ˆ์šฉ๋˜๋Š” ์ด์ƒํ•œ ๋ฐฐ์—ด๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ Flow๋Š” ์˜ต์…˜ 2๋ฅผ ์‚ฌ์šฉ ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ SoundScript๊ฐ€ ํฌ์†Œ ๋ฐฐ์—ด์„ ํ•ด๋‹น ์‚ฌ์–‘์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ถˆ๋ฒ•์œผ๋กœ ๋งŒ๋“œ๋Š”์ง€ ํ™•์ธ ํ•ด๋‹น ๋ฐฐ์—ด์„ ๋ถˆ๋ฒ•์œผ๋กœ ๋งŒ๋“ค๊ณ  SoundScript๋Š” ์ƒˆ ๊ทœ์น™์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค). ์ˆ˜๋™ ๊ธธ์ด ๋ณ€๊ฒฝ ๋ฐ ์ดˆ๊ธฐ ํ• ๋‹น์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์—ฌ์ „ํžˆ ํŒŒ์•…ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ํŽธ๋ฆฌํ•จ ๋Œ€ ์•ˆ์ „ ์ ˆ์ถฉ์•ˆ์—์„œ ์˜ต์…˜ 1์— ๋” ๊ฐ€๊นŒ์›Œ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์“ฐ๊ธฐ๊ฐ€ ๋œ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋” ์•ˆ์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ ๊ฑด์ „์„ฑ์— ์ค‘์ ์„ ๋‘๊ธฐ ๋•Œ๋ฌธ์ด์ง€๋งŒ ์•„๋งˆ๋„ ๋‹ค์†Œ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌ์†Œ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๊ธˆ์ง€๋กœ ์ธํ•ด ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹๋ณด๋‹ค

AFAIK TypeScript๋Š” ์—ฌ๊ธฐ์—์„œ ์–ด๋–ค ์„ ํƒ์— ๋Œ€ํ•œ ์บ์ŠคํŠธ์— ๊ด€๊ณ„์—†์ด ๋™์ผํ•œ JS๋ฅผ ๊ณ„์† ๋ฐฉ์ถœํ•˜๊ณ  ๊ธฐ๋ณธ VM์€ ๊ด€๊ณ„์—†์ด ํ›„๋“œ ์•„๋ž˜์—์„œ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ ์–ด๋ ˆ์ด๋ฅผ ๊ณ„์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์‹œ์ ์—์„œ ์„ฑ๋Šฅ ์ธก๋ฉด์€ ๋งค์šฐ ์ด๋ก ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๊ทธ ์ฃผ์žฅ์— ๊ทธ๋‹ค์ง€ ํ”๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ๋งˆ์Œ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ๋Œ€๋ถ€๋ถ„ ํŽธ์˜์„ฑ ๋Œ€ ์•ˆ์ „์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์—ฌ๊ธฐ์—๋Š” ์•ˆ์ „์ƒ์˜ ์ด์ ์ด ํŽธ๋ฆฌํ•จ์„ ์ ˆ์ถฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๋‘˜ ์ค‘ ํ•˜๋‚˜๋Š” ๋ชจ๋“  ์œ ํ˜•์ด nullable์ด ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐœ์„ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๋ถ€๋ถ„์ด ๋Œ€๋ถ€๋ถ„ ์ด๋ก ์ ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ
๊ฐ€์ •์˜ ํŽธ๋ฆฌํ•จ์ฒ˜๋Ÿผ. ๋Œ€๋ถ€๋ถ„์˜ ๋ฐฐ์—ด์€ ๋ฐ€๋„๊ฐ€ ๋†’์œผ๋ฉฐ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋Š”
๋ถ€์šธ ๋ฐ ์ˆซ์ž ๋ฐฐ์—ด์—๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ
์กฐ๋ฐ€ํ•œ ๋ฐฐ์—ด๋กœ ์˜๋„๋œ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ nullable๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ
์˜๋„๋Š” ๋ถ„๋ช…ํ•˜๋‹ค.


TypeScript๋Š” ์ฃผ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ •๋ง ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—์„œ ๋ณด์•˜๋‹ค
V8 ์ฝ”๋“œ ๊ธฐ๋ฐ˜์€ ๊ฐ€์ •์„ ํ—ˆ์šฉํ•˜๋Š” UNREACHABLE(); ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.
์ข€ ๋” ์•ˆ์ „ํ•˜๊ฒŒ, ๋ถˆ๋ณ€๋Ÿ‰์ด ์œ„๋ฐ˜๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ ์ถฉ๋Œ์‹œํ‚ต๋‹ˆ๋‹ค. C++
์œ ํ˜• ๊ฒ€์‚ฌ์— ๋„์›€์ด ๋˜๋Š” ์ •์  ์ฃผ์žฅ์„ ์œ„ํ•œ static_assert ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2015๋…„ 10์›” 20์ผ ํ™”์š”์ผ ์˜ค์ „ 4:01, Matt Baker ์•Œ๋ฆผ @github.com
์ผ๋‹ค:

์˜ต์…˜ 3์€ ์•ฝ๊ฐ„์˜ ํšก์„ค์ˆ˜์„คํ•œ ์ œ์•ˆ์ด์—ˆ์Šต๋‹ˆ๋‹ค. [์ด๋ฏธ์ง€:
:stuck_out_tongue:]

Re: ๋งˆ์ง€๋ง‰ ์งˆ๋ฌธ:

const regularStrings ์„ ์–ธ: string[], const nullableStrings ์„ ์–ธ: string?[], const nonNullableStrings ์„ ์–ธ: string![]; // ์˜ต์…˜ 3์—์„œ ์œ ํ˜• ๊ฒ€์‚ฌ ์‹คํŒจ
for(regularStrings์˜ const ํ•ญ๋ชฉ) {
// ์˜ต์…˜ 1: ํ•ญ๋ชฉ์ด ๋ฌธ์ž์—ด ์œ ํ˜•์ž…๋‹ˆ๊นŒ?
// ์˜ต์…˜ 2: ๊ธฐ๋ณธ null ํ—ˆ์šฉ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
}
for(nullableStrings์˜ const ํ•ญ๋ชฉ) {
// ์˜ต์…˜ 1๊ณผ 2: ํ•ญ๋ชฉ์ด ๋ฌธ์ž์—ด ์œ ํ˜•์ž…๋‹ˆ๊นŒ?
}
for(nonNullableStrings์˜ const ํ•ญ๋ชฉ) {
// ์˜ต์…˜ 1: ํ•ญ๋ชฉ์ด ๋ฌธ์ž์—ด ์œ ํ˜•์ž…๋‹ˆ๊นŒ?
// ์˜ต์…˜ 2: ํ•ญ๋ชฉ์ด ๋ฌธ์ž์—ด ์œ ํ˜•์ž…๋‹ˆ๋‹ค!
}

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” - nullable์ด ์•„๋‹Œ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์—ด์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ โ€” ์ถ”๊ฐ€ ์บ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์˜ต์…˜ 1์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ •์˜๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์ด ์—†์Œ์„ ๋ณด์žฅํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
๋ฐฐ์—ด์˜ ๊ฐ’(์ด ๋ณด์ฆ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์–ด๋–ค ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•˜๋“  ์ƒ๊ด€์—†์ด ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!).
๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‘˜ ๋‹ค ๋” ๋ช…์‹œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค(๋‹น์‹ ์€
์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™์„ ํ•  ๋•Œ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค.
์•”์‹œ์ ์œผ๋กœ ๋ฐœ์ƒ) ๋Œ€๋ถ€๋ถ„์˜ ์ปจํ…Œ์ด๋„ˆ ํด๋ž˜์Šค์™€ ๋” ์ผ๊ด€์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ž‘์—…: ์˜ˆ๋ฅผ ๋“ค์–ด Map์˜ get ํ•จ์ˆ˜๋Š” ๋ถ„๋ช…ํžˆ nullable ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
(ํ‚ค ์•„๋ž˜์— ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค),
Map.prototype.get์ด nullable์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด object['property']
์— ๋Œ€ํ•ด ๋น„์Šทํ•œ ๋ณด์ฆ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ ๋˜‘๊ฐ™์ด ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
null ํ—ˆ์šฉ ์—ฌ๋ถ€์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์„ ํ™€์ˆ˜๋กœ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค.
null ์ฐธ์กฐ ์˜ค๋ฅ˜๊ฐ€ ๋‹ค์‹œ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์™€ ์ž„์˜ ์•ก์„ธ์Šค๊ฐ€ ์žˆ๋Š” ์œ„์น˜
์œ ํ˜• ์‹œ์Šคํ…œ์— ์˜ํ•ด null์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ Flow๋Š”
์˜ต์…˜ 2 http://flowtype.org/docs/nullable-types.html ๋ฐ ๋งˆ์ง€๋ง‰ I
ํ™•์ธ๋œ SoundScript๋Š” ํฌ์†Œ ๋ฐฐ์—ด์„ ์‚ฌ์–‘์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ถˆ๋ฒ•์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/rwaldron/tc39-notes/blob/master/es6/2015-01/JSExperimentalDirections.pdf
(์Œ, ๊ฐ•๋ ฅํ•œ ๋ชจ๋“œ/"SaneScript"๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋ถˆ๋ฒ•์œผ๋กœ ๋งŒ๋“ค๊ณ  SoundScript๋Š”
์ƒˆ๋กœ์šด ๊ทœ์น™์˜ ์ƒ์œ„ ์ง‘ํ•ฉ), ์ด๋Š” ์–ด๋Š ์ •๋„ ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•ฉ๋‹ˆ๋‹ค.
์ˆ˜๋™ ๊ธธ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ด์•ผ ํ•˜์ง€๋งŒ
๋ณ€๊ฒฝ ๋ฐ ์ดˆ๊ธฐ ํ• ๋‹น.

ํ˜„์žฌ๋กœ์„œ๋Š” ์„ฑ๋Šฅ์ ์ธ ์ธก๋ฉด์ด ์ง€๊ทนํžˆ ์ด๋ก ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค๋งŒ,
AFAIK TypeScript๋Š” ๊ด€๊ณ„์—†์ด ๋™์ผํ•œ JS๋ฅผ ๊ณ„์† ๋ฐฉ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์—
์—ฌ๊ธฐ์—์„œ ์›ํ•˜๋Š” ๋Œ€๋กœ ์บ์ŠคํŠธํ•˜๋ฉด ๊ธฐ๋ณธ VM์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.
์ƒ๊ด€์—†์ด ํ›„๋“œ ์•„๋ž˜์˜ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ ๋ฐฐ์—ด. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋„ˆ๋ฌด ํœ˜๋‘˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
๊ทธ ์ฃผ์žฅ. ๋‚ด ๋งˆ์Œ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ๋Œ€๋ถ€๋ถ„ ํŽธ์˜์„ฑ ๋Œ€
์•ˆ์ „; ๋‚˜์—๊ฒŒ ์—ฌ๊ธฐ์—๋Š” ์•ˆ์ „์ƒ์˜ ์ด์ ์ด ํŽธ๋ฆฌํ•จ์„ ์ ˆ์ถฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜
๋ฌผ๋ก  ์–ด๋Š ์ชฝ์ด๋“  ๋ชจ๋“  ์œ ํ˜•์ด nullable์ด ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐœ์„ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -149468527
.

์ด์‚ฌ์•„ ๋ฉ”๋„์šฐ์ฆˆ

non-void ์œ ํ˜•์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์–ด์จŒ๋“  T! ๋˜๋Š” !T ๋กœ non-void ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์–ด๋ ต๊ณ  TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ non-void ์œ ํ˜•์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Flow์™€ ์œ ์‚ฌํ•œ ์ •์  ๋ถ„์„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋™์ž‘์ด ์ „ํ˜€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์ง€๋งŒ ๋” ๋งŽ์€ ๋ฒ„๊ทธ๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ์ด ํด๋ž˜์Šค์˜ ๋Œ€๋ถ€๋ถ„ ์˜ ๋ฒ„๊ทธ๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ตฌ๋ฌธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์•ž์œผ๋กœ๋Š” ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ๋˜๋Š” ๊ธฐ๋ณธ ๋™์ž‘์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

``` .ts
// ํ•จ์ˆ˜๋Š” ํ–‰๋ณตํ•˜๊ฒŒ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ len(x: ๋ฌธ์ž์—ด): ์ˆซ์ž {
๋ฐ˜ํ™˜ x.๊ธธ์ด;
}

len("์ž‘๋™"); // 5
len(๋„); // ์˜ค๋ฅ˜, null ์†์„ฑ ๊ธธ์ด ์—†์Œ

``` .ts
function len(x: string): number {
    if (x === null) {
        return -1;
    }
    return x.length;
}

len("works"); // 5
len(null); // null

์—ฌ๊ธฐ์„œ ์‹ค์ œ๋กœ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ non-void ๋กœ ๋ชจ๋ธ๋งํ•˜์ง€๋งŒ ํ•จ์ˆ˜์—์„œ ์ฒ˜๋ฆฌ๋  ๋•Œ ์•”์‹œ์ ์œผ๋กœ void ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ null ๋˜๋Š” undefined ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ์œ ํ˜•์€ non-void undefined

?T ๋˜๋Š” T? ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์€ ์‚ฌ์šฉ ์ „์— null(๋ฐ/๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์Œ) ๊ฒ€์‚ฌ๋ฅผ ๊ฐ•์ œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ T? ๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ Flow ์™€ ํ•จ๊ป˜ ?T ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„ ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

``` .ts
ํ•จ์ˆ˜ len(x: ?๋ฌธ์ž์—ด): ์ˆซ์ž {
๋ฐ˜ํ™˜ x.๊ธธ์ด; // ์˜ค๋ฅ˜: ?string ์œ ํ˜•์— ๊ธธ์ด ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
}

One more example -- what about using function results?

``` .js
function len(x: string): number {
    return x.length;
}

function identity(f: string): string {
    return f;
}

function unknown(): string {
    if (Math.random() > 0.5) {
        return null;
    }
    return "maybe";
}

len("works"); // 5
len(null); // error, no property length of null

identity("works"); // "works": string
identity(null); // null: void
unknown(); // ?string

len(identity("works")); // 5
len(identity(null)); // error, no property length of null
len(unknown()); // error: no length property on type ?string, you must use a type guard

๋‚ด๋ถ€์ ์œผ๋กœ๋Š” TypeScript๊ฐ€ null์„ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€์™€ null ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฐ’์ด ์ œ๊ณต๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ํ˜•์‹์ด null์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์œ ์ถ”ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์œ ์ผํ•œ ๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์€ ์ •์˜ ํŒŒ์ผ๊ณผ ์ธํ„ฐํŽ˜์ด์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. function(t: T) ์„ ์–ธํ•˜๋Š” ์ •์˜ ํŒŒ์ผ์ด ๋‘ ๋ฒˆ์งธ ์˜ˆ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ null/ void ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ •ํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ null ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋‘ ๊ฐ€์ง€๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. ?T ์œ ํ˜• ๊ตฌ๋ฌธ์˜ ์ ์ง„์ ์ธ ์ฑ„ํƒ, ์ด ์ค‘ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด๋ฏธ ๊ต์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ์•ž์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ --noImplicitVoid ๊ฐ€ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ์„ ์–ธ ํŒŒ์ผ์„ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ ํŒŒ์ผ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "์ค‘๋‹จ"์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋จผ ๊ธธ์„ ๊ฐ€๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์œ ํ˜•์ด void ๋ฐ T ๋•Œ ?T ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค. ํ•  ์ˆ˜ ์—†์„ ๋•Œ. ๋˜ํ•œ ์˜ตํŠธ์ธ์ด ๋˜๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ์‚ฌ๋žŒ๋“ค๋งŒ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๊ฐœ์ฒด๊ฐ€ ๋ฌดํšจ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ?T ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript์—์„œ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ํ›จ์”ฌ ํ–ฅ์ƒ๋œ ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ๋ฅผ ์ฐพ๋Š” ๋™์‹œ์— ์ •์˜ ํŒŒ์ผ๊ณผ ์‰ฝ๊ณ  ์ƒ๋‹นํžˆ ์ง๊ด€์ ์ด๋ฉฐ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ํ†ตํ•ฉ์„ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์ด ํ˜„์‹ค์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ ‘๋‘์‚ฌ ? ๋ณ€ํ˜•์€ IIRC ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ ์ฃผ์„์—์„œ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2015๋…„ 11์›” 17์ผ ํ™”์š”์ผ 13:37 Tom Jacques [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ non-void ์œ ํ˜•์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์–ด์จŒ๋“  ๋‚˜๋Š” ์ƒ๊ฐํ•œ๋‹ค.
T๋กœ non-void๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค! ๋˜๋Š” !T๋Š” ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค. ์–ด๋ ต๋„ค
์ธ๊ฐ„์œผ๋กœ์„œ ์ฝ๊ธฐ์—, ๋˜ํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ.

๊ธฐ๋ณธ์ ์œผ๋กœ void๊ฐ€ ์•„๋‹Œ ์œ ํ˜•์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ๋ฌธ์ œ๋Š”
๊นจ๋Š” ๋ณ€ํ™”. ์ข€ ๋” ์ •์  ๋ถ„์„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
Flow์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋™์ž‘์„ ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์ง€๋งŒ
๋” ๋งŽ์€ ๋ฒ„๊ทธ? ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ด ํด๋ž˜์Šค์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋ฒ„๊ทธ๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์ง€๋งŒ
๊ตฌ๋ฌธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์•ž์œผ๋กœ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ
๋œ ๊นจ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ๋˜๋Š” ๊ธฐ๋ณธ ๋™์ž‘์„ ๋„์ž…ํ•˜์‹ญ์‹œ์˜ค.
๋ณ€ํ™”.

// ํ•จ์ˆ˜๋Š” ํ–‰๋ณตํ•˜๊ฒŒ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.function len(x: string): number {
๋ฐ˜ํ™˜ x.๊ธธ์ด;
}

len("์ž‘๋™"); // 5
len(๋„); // ์˜ค๋ฅ˜, null ์†์„ฑ ๊ธธ์ด ์—†์Œ

ํ•จ์ˆ˜ len(x: ๋ฌธ์ž์—ด): ์ˆซ์ž {
if (x === null) {
๋ฐ˜ํ™˜ -1;
}
๋ฐ˜ํ™˜ x.๊ธธ์ด;
}

len("์ž‘๋™"); // 5
len(๋„); // ์—†๋Š”

์—ฌ๊ธฐ์„œ ์‹ค์ œ๋กœ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌดํšจ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜์—์„œ ์ฒ˜๋ฆฌ๋  ๋•Œ ์•”์‹œ์ ์œผ๋กœ void๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ,
๋ช…์‹œ์ ์œผ๋กœ null์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ์œ ํ˜•์€ ๋ฌดํšจ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
์ฐพ์œผ์‹œ๋Š” ์ฃผ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ?T ๋˜๋Š” T๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? null(๋ฐ/๋˜๋Š”
undefined) ์‚ฌ์šฉ ์ „์— ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ฐœ์ธ์ ์œผ๋กœ T?๋ฅผ ์ข‹์•„ํ•˜๋Š”๋ฐ ์„ ๋ก€๊ฐ€ ์žˆ๋‹ค
?T๋ฅผ Flow์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ len(x: ?๋ฌธ์ž์—ด): ์ˆซ์ž {
๋ฐ˜ํ™˜ x.๊ธธ์ด; // ์˜ค๋ฅ˜: ?string ์œ ํ˜•์— ๊ธธ์ด ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
}

ํ•œ ๊ฐ€์ง€ ๋” ์˜ˆ๋ฅผ ๋“ค์–ด -- ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

ํ•จ์ˆ˜ len(x: ๋ฌธ์ž์—ด): ์ˆซ์ž {
๋ฐ˜ํ™˜ x.๊ธธ์ด;
}
ํ•จ์ˆ˜ ์‹๋ณ„(f: ๋ฌธ์ž์—ด): ๋ฌธ์ž์—ด {
๋ฆฌํ„ด f;
}
์•Œ ์ˆ˜ ์—†๋Š” ํ•จ์ˆ˜(): ๋ฌธ์ž์—ด {
if (Math.random() > 0.5) {
null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
}
"์•„๋งˆ๋„"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
}

len("์ž‘๋™"); // 5
len(๋„); // ์˜ค๋ฅ˜, null ์†์„ฑ ๊ธธ์ด ์—†์Œ

์‹ ์›("์ž‘๋™"); // "์ž‘๋™": ๋ฌธ์ž์—ด
์•„์ด๋ดํ‹ฐํ‹ฐ(null); // null: ๋ฌดํšจ
์•Œ๋ ค์ง€์ง€ ์•Š์€(); // ?๋ˆ

len(identity("์ž‘๋™")); // 5
len(์•„์ด๋ดํ‹ฐํ‹ฐ(๋„)); // ์˜ค๋ฅ˜, null ์†์„ฑ ๊ธธ์ด ์—†์Œ
len(์•Œ ์ˆ˜ ์—†์Œ()); // ์˜ค๋ฅ˜: ?string ์œ ํ˜•์— ๊ธธ์ด ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€์—์„œ ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š” ์ผ์€ TypeScript๊ฐ€
์œ ํ˜•์ด ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ์œ ํ˜•์ด null์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์œ ์ถ”ํ•ฉ๋‹ˆ๋‹ค.
null์ด๋ฉฐ null ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฐ’์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์œ ์ผํ•œ ๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์€ ์ •์˜ ํŒŒ์ผ๊ณผ ์ธํ„ฐํŽ˜์ด์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‚˜
๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ •ํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค.
ํ•จ์ˆ˜(t: T)๋ฅผ ์„ ์–ธํ•˜๋Š” ์ •์˜ ํŒŒ์ผ์€ null/void ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ ์˜ˆ์ฒ˜๋Ÿผ. ์ด๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์ด
์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” null ๊ฐ’.

์ด์ œ ๋‘ ๊ฐ€์ง€๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. ์„ ํƒ ์‚ฌํ•ญ์ธ ?T ์œ ํ˜• ๊ตฌ๋ฌธ์˜ ์ ์ง„์  ์ฑ„ํƒ
    ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด๋ฏธ ๊ต์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ์•ž์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ --noImplicitVoid๊ฐ€ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์„ ์–ธ ํŒŒ์ผ์„ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ ํŒŒ์ผ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ
    "ํŒŒ๊ดด"๊ฐ€ ๋˜๊ฒ ์ง€๋งŒ, ๋จผ ๊ธธ์„ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋Œ€๋ถ€๋ถ„์˜
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์œ ํ˜•์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ?T๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค.
    void์ด๊ณ  T๊ฐ€ ๋  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜ตํŠธ์ธ์ด ๋˜๋ฏ€๋กœ
    ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ์‚ฌ๋žŒ์€ ์˜ํ–ฅ์„ ๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ›จ์”ฌ ํ–ฅ์ƒ๋œ ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์ด ํ˜„์‹ค์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
TypeScript์—์„œ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ๋ฅผ ์ฐพ๊ณ ,
์—ฌ์ „ํžˆ ์‰ฝ๊ณ , ์ƒ๋‹นํžˆ ์ง๊ด€์ ์ด๋ฉฐ, ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์ •์˜ ํŒŒ์ผ๊ณผ์˜ ํ†ตํ•ฉ.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -157463734
.

์ข‹์€ ์ง€์ . ๋˜ํ•œ ๊ธฐ์กด์˜ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๋งŽ์€ ์œ ์‚ฌ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

``` .ts
OptionalProperty {
o?: ๋ฌธ์ž์—ด
}
VoidableProperty {
o: ?๋ฌธ์ž์—ด
}

ํ•จ์ˆ˜ withOptionalParam(o?: ๋ฌธ์ž์—ด) { }
ํ•จ์ˆ˜ withVoidableParam(o: ?string) { }
```

์‹ค์ œ๋กœ ๊ทธ๋“ค์€ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค . ๋ช…์‹œ์  nullable ํ˜•์‹์—๋Š” ? ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  nullable์ด ์•„๋‹Œ ํ˜•์‹์—๋Š” ! ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ nullable์ž…๋‹ˆ๋‹ค.

voidable ๋Œ€ nullable ๊ตฌ๋ณ„์€ ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. :+1:

์ด ๋น™๋น™ ๋„๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

๋ฌดํšจํ™” ๊ฐ€๋Šฅ/ ๋ฌดํšจํ™” ๋ถˆ๊ฐ€๋Šฅ ์ •์˜๊ฐ€ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋ฅผ ์œ„์—์„œ ๋ชจ๋‘ ์ฝ์—ˆ์Šต๋‹ˆ๊นŒ?

@Griffork ๋ชจ๋“  ๋Œ“๊ธ€์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งํ•œ ๊ฒƒ์„ ๋‹ค์†Œ ์žฌํƒ•/์กฐํ•ฉํ•œ ๊ฒƒ์ž„์„ ์ธ์ •ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ฐ€์žฅ ํ˜„์‹ค์ ์ธ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด์ง€๋งŒ ๋‚˜์—๊ฒŒ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋Š” null ๋ฐ undefined ๊ฐ€ ๋ชจ๋“  ์œ ํ˜•์˜ ์ผ๋ถ€์ด๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ˜„์žฌ ์‹œ๋„ํ•  ๋•Œ ์•ˆ์ „์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. T ์œ ํ˜•์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์˜ˆ์— ๋”ฐ๋ผ :

``` .ts
ํ•จ์ˆ˜ len(x: ๋ฌธ์ž์—ด): ์ˆซ์ž {
๋ฐ˜ํ™˜ x.๊ธธ์ด;
}

len("์ž‘๋™");
// ์˜ค๋ฅ˜ ์—†์Œ -- 5

len(๋„);
// ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
// ์˜ค๋ฅ˜: null์˜ '๊ธธ์ด' ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

len(์ •์˜๋˜์ง€ ์•Š์Œ);
// ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
// ์˜ค๋ฅ˜: ์ •์˜๋˜์ง€ ์•Š์€ '๊ธธ์ด' ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
```

์ด๊ฒƒ์ด _์–ธ์–ด_์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ์ธ ์•ˆ์ „ ๋ถ€์กฑ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฌํ•ด์ž…๋‹ˆ๋‹ค. ์ •์  ๋ฐ ์œ ํ˜• ๋ถ„์„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜์˜ ํ๋ฆ„์„ ์‚ดํŽด๋ณด๊ณ  ๋ฌด์–ธ๊ฐ€๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๋ฉด ์ด ๋ฌธ์ œ์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ?T ์œ ํ˜•์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ชจ๋“  ๊ฒฝ์šฐ์— ํ•ญ์ƒ ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ). ?T ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์œ ๋Š” ์•ˆ์ „ ์ ๊ฒ€์„ ๊ฐ•์ œํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜๋„๋ฅผ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

_implementation_์˜ ๋ฌธ์ œ๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ž…๋‹ˆ๋‹ค. TS ํŒ€์ด ํ˜„์žฌ T ์œ ํ˜•์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌดํšจ๊ฐ€ ์•„๋‹Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‚ด์ผ ๋ฆด๋ฆฌ์Šคํ•˜๋ฉด ํ•ด๋‹น ์œ ํ˜• ์„œ๋ช…์œผ๋กœ ํ˜„์žฌ ๋ฌดํšจ ์ž…๋ ฅ์„ ์ˆ˜๋ฝํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. TS ํŒ€ ๊ตฌ์„ฑ์›์€ ๋ฐ”๋กœ ์ด ๋ฌธ์ œ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํฐ ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•  ์˜์‚ฌ๊ฐ€ ์—†๋‹ค๊ณ  ๋ฐํ˜”์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํšจ๊ณผ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘๊ณ  ์ด์ต์ด ์ถฉ๋ถ„ํžˆ ํฌ๋ฉด ์–ด๋–ค ๊ฒƒ์„ ๊ธฐ๊บผ์ด ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋„ˆ๋ฌด ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ ์ œ์•ˆ์€ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์‹ค์ œ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๋Š” ๊ฒƒ ์™ธ์—๋Š” ๊ธฐ์กด ๊ตฌ๋ฌธ/์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ์–ธ์–ด์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ์ถ”๊ฐ€ ์‚ฌํ•ญ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์˜ค๋ฅ˜์˜ ์˜ํ–ฅ์„ ์ค„์ด๋Š” ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์— non-void ์œ ํ˜•์— ๋Œ€ํ•œ ๋” ๊ฐ•๋ ฅํ•œ ๋ณด์žฅ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊นจ๋œจ๋ ธ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ์ด์ง€๋งŒ ๋” ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ํฌ๊ธฐ์™€ ํŠน์„ฑ์„ ๊ฐ–๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1๋ถ€:

  • null/undefined/void ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ถ„์„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(TS ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•˜๋ฉฐ ์ •์˜ ํŒŒ์ผ์—๋Š” ์—†์Œ).
  • ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฌดํšจ ํ™•์ธ์„ ๊ฐ•์ œํ•˜๋Š” ?T ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์–ธ์–ด ์ˆ˜์ค€ ์˜ต์…˜ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์ƒ์˜ ์„คํƒ•์ž…๋‹ˆ๋‹ค.
  • ์ด ๋‘ ๊ธฐ๋Šฅ์€ ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ์žฅ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„:

  • ๊ธฐ๋‹ค๋ฆฌ๋‹ค. ๋‚˜์ค‘์— 1๋ถ€๊ฐ€ ์†Œ๊ฐœ๋˜๊ณ  TS์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์‹œ๊ฐ„์ด ์ƒ๊ธด ํ›„ ํ‘œ์ค€์€ ์œ ํ˜•์ด null์ด ์•„๋‹ ๋•Œ T ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ?T ์œ ํ˜•์ด null์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ. ์ด๊ฒƒ์ด ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์ง€๋งŒ ์ด๊ฒƒ์ด ๋ถ„๋ช…ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ„๋„์˜ ๊ธฐ๋Šฅ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ --noImplicitVoid ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜•์‹์ด ๋ฌดํšจ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ?T ๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์‹œํ–‰ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ์ •์˜ ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์ง€๋งŒ ์ด๊ฒƒ์ด ์˜ตํŠธ์ธ์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค.
  • ๋‹น์‹ ์ด ์ •๋ง๋กœ ์—„๊ฒฉํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด, ํ”Œ๋ž˜๊ทธ๋Š” ๊ทธ๊ฒƒ์ด ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ/ํŒŒ์ผ์„ ์ง€์ •ํ•˜๋Š” ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฝ”๋“œ์—๋งŒ ์ ์šฉํ•˜๊ณ  node_modules ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๋ถ€๊ฐ€ ์—†์–ด๋„ 1๋ถ€๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ํ˜„์‹ค์ ์ธ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๋ฅผ ํฌ๊ฒŒ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋ผ๋ฉด ์ถฉ๋ถ„ํžˆ ๋ฐ›์•„๋“ค์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฏธ๋ž˜์— null์ด ์•„๋‹Œ ์‹ค์ œ ์œ ํ˜•์— ๋Œ€ํ•œ ์˜ต์…˜์„ ํ…Œ์ด๋ธ”์— ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฌธ์ œ๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ์˜ค๋ž˜ ์ง€์†๋ ์ˆ˜๋ก TS์— ์ž‘์„ฑ ์ค‘์ธ ์ฝ”๋“œ๊ฐ€ ๋” ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋” ๋งŽ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 1๋ถ€์—์„œ๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ ๊ทธ ์†๋„๋ฅผ ๊ทน์ ์œผ๋กœ ๋Šฆ์ถ”๊ณ  ๊ธฐ๊ปํ•ด์•ผ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์˜ํ–ฅ์„ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@tejacques ์ €๋Š” ์ด์— ์ „์ ์œผ๋กœ

@tejacques - FWIW, ๊ท€ํ•˜์˜ ํ‰๊ฐ€ ๋ฐ ์ œ์•ˆ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. TS ํŒ€์ด ๋™์˜ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. :)

์‚ฌ์‹ค ๋‘ ๊ฐ€์ง€:

์ฒซ์งธ, 1๋ถ€์—์„œ ์–ธ๊ธ‰ํ•œ Flow์™€ ๊ฐ™์€ ๋ถ„์„์ด ํ•„์š”ํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋ฉ‹์ง€๊ณ  ์œ ์šฉํ•˜์ง€๋งŒ, voidable/ ?T ์œ ํ˜•์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์€ ์–ธ์–ด์˜ ํ˜„์žฌ ๋””์ž์ธ์—์„œ ํ›จ์”ฌ ๋” ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜๊ณ  ํ›จ์”ฌ ๋” ์žฅ๊ธฐ์ ์ธ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ --noImplicitVoid ๋ฅผ ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. "์œ ํ˜•์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”๊ตฌํ•˜๋Š” ๋Œ€์‹  ๋ฌดํšจํ™” ๋ถˆ๊ฐ€๋Šฅํ•œ(์ฆ‰, ๊ธฐ๋ณธ) ์œ ํ˜•์— null ๋ฐ undefined ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌดํšจํ™”๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ?T ". ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์˜๋ฏธ๋ก  ๋งŒ ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. TS๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์‹œํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์ธ ์ •์˜๋ณด๋‹ค๋Š” ์‚ฌ์šฉ๋ฒ•์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ ๋ง‰ ๋– ์˜ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด 4๊ฐ€์ง€ ์ˆ˜์ค€์˜ ๋ฌดํšจํ™” ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Š” Flow์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋ฉฐ, ์ด ๋Œ€ํ™”์—์„œ ๋งŽ์€ ์˜๊ฐ์„ ์ฃผ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค).

interface Foo {
  w: string;
  x?: string;
  y: ?string;
  z?: ?string;
}

--noImplicitVoid ์—์„œ w ๋Š” ์œ ํšจํ•œ ๋ฌธ์ž์—ด๋งŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ ํ˜• ์•ˆ์ „์— ๋Œ€ํ•œ ํฐ ์Šน๋ฆฌ์ž…๋‹ˆ๋‹ค. ์•ˆ๋…•, 10์–ต ๋‹ฌ๋Ÿฌ์˜ ์‹ค์ˆ˜! ๋ฌผ๋ก  --noImplicitVoid ์—†์œผ๋ฉด ์œ ์ผํ•œ ์ œ์•ฝ ์กฐ๊ฑด์€ ์ง€์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ null์ด๊ฑฐ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ธ์–ด์˜ ๋‹ค์†Œ ์œ„ํ—˜ํ•œ ํ–‰๋™์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

x ์€ ํ˜„์žฌ ์„ค์ •์—์„œ ์™„์ „ํžˆ ๊ด€๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ string, null, undefined์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์— ์กด์žฌํ•  ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค. --noImplicitVoid ์—์„œ๋Š” ์ƒํ™ฉ์ด ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค... ์ •์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ฌด์–ธ๊ฐ€๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ฌดํšจ๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? Flow๊ฐ€ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ x ๋ฅผ undefined (๋น„์กด์žฌ๋ฅผ ๋ชจ๋ฐฉ)๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ null ๋Š” ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ TypeScript์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋…๋‹จ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ x ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฌดํšจ ํ™•์ธ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ดํ•ด๊ฐ€ ๋˜์ง€๋งŒ, ์ด๋Š” ์—ญ์‹œ ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋™์ž‘์ด --noImplicitVoid ํ”Œ๋ž˜๊ทธ์˜ ์ผ๋ถ€์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

y ๋Š” ์ž„์˜์˜ ๋ฌธ์ž์—ด ๋˜๋Š” ๋ฌดํšจ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ _๋ฐ˜๋“œ์‹œ_ ๋ฌดํšจ์ผ์ง€๋ผ๋„ ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ๋ฌดํšจ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ ์•ฝ๊ฐ„ ์˜์™ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. undefined ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ _not_ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌดํšจ ์ˆ˜ํ‘œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  x ์™€ ๋‹ค๋ฅธ ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋งˆ์ง€๋ง‰์œผ๋กœ z ๋Š” ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ ˆ๋Œ€์ ์œผ๋กœ ๋ฌด์—‡์ด๋“  ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ(๋ฌผ๋ก  ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ์ œ์™ธ) ์•ก์„ธ์Šคํ•˜๊ธฐ ์ „์— ๋ฌดํšจ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์—ฌ๊ธฐ์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

x ์™€ y ์‚ฌ์ด์—๋Š” ์•ฝ๊ฐ„์˜ ๊ฒน์นจ์ด ์žˆ์œผ๋ฉฐ x x ๋Š” ๊ฒฐ๊ตญ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ตœ๋Œ€ํ•œ์˜ ์•ˆ์ „์„ ์œ„ํ•ด z ํ˜•์‹์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. .

@tejacques

๋ถ„์„์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ?T ์œ ํ˜•์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ชจ๋“  ๊ฒฝ์šฐ์— ํ•ญ์ƒ ์™„๋ฒฝํ•˜๊ฒŒ ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ).

์ด ์ง„์ˆ ์€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ null ํ—ˆ์šฉ ์—ฌ๋ถ€์˜ ๋งŽ์€ ์ธก๋ฉด์„ ์„ค๋ช…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ (์ •์ ์œผ๋กœ) ํ˜ธ์ถœํ•  ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ทธ์— ๋”ฐ๋ผ ์ฃผ์„ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ null ์ „๋‹ฌ์ด ๊ดœ์ฐฎ์€์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. TS์™€ ๊ฐ™์€ ๊ตฌ์กฐ์  ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ๋Š” ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ด๊ณ  ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ์ง€ ์•Œ๊ธฐ์กฐ์ฐจ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์ง€๋งŒ ์†Œ์Šค ์ฝ”๋“œ์—์„œ null ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์ถ”๋ก ํ•˜๋ ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ: list ๋ฐฐ์—ด๊ณผ null ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง„ ํ•จ์ˆ˜ unsafe(x) ์žˆ๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ผ์ธ์ด ์•ˆ์ „ํ•œ์ง€ ์—ฌ๋ถ€: list.filter(unsafe) . ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ list ์˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋‚ด์šฉ์ด ๋ฌด์—‡์ธ์ง€ ์ •์ ์œผ๋กœ ์•Œ ์ˆ˜ ์—†๋‹ค๋ฉด ์ด๊ฒƒ์€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ์ƒ์† ๋“ฑ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

null ๊ณ„์•ฝ์˜ ๋…ธ๊ณจ์ ์ธ ์œ„๋ฐ˜์„ ํ‘œ์‹œํ•˜๋Š” ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๋Š” ๋ง์€ ์•„๋‹™๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ null ์ฃผ์„์˜ ์œ ์šฉ์„ฑ์„ ๊ฒฝ์‹œํ•˜๋Š” ๊ฒƒ์€ IMHO ์˜ค๋ฅ˜๋ผ๋Š” ๊ฒƒ์„ ์ง€์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” null ํ—ˆ์šฉ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ถ”๋ก ์ด ๋งŽ์€ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์— ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๊ณ  ์ด ํ† ๋ก ์˜ ์–ด๋”˜๊ฐ€์—์„œ ๋งํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์†Œ์Šค ์ฃผ์„์„ ์™„์ „ํžˆ ๋Œ€์ฒดํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

@tejacques ๋‚ด ๋‚˜์œ, ๋‚˜๋Š” ๋‹น์‹ ์˜ ์˜๊ฒฌ์„ ์ž˜๋ชป ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค (์–ด๋–ค ์ด์œ ๋กœ ๋‚ด ๋‘๋‡Œ๊ฐ€ void===null ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค :(๋‚˜๋Š” ๋‹จ์ง€ ์ž ์—์„œ ๊นจ์–ด๋‚œ ํƒ“์ž…๋‹ˆ๋‹ค).
๊ทธ๋ž˜๋„ ์ถ”๊ฐ€ ๊ฒŒ์‹œ๋ฌผ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ดํ•ด๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์‹ค ๊ทธ ์•„์ด๋””์–ด๋ฅผ ๊ฝค ์ข‹์•„ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ๊ธ€์— ์“ฐ๋Š”๊ฑด ์ฝ์„ ์ˆ˜ ์—†๋Š” ๋ฉ์–ด๋ฆฌ๋ผ ์…‹์ด์„œ ๋”ฐ๋กœ ๋‹ต์žฅ์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

@Griffor ๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ํ…์ŠคํŠธ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๋Œ€๋กœ ์ „๋‹ฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ  ์–ด์จŒ๋“  ๋ช…ํ™•ํžˆ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@dallonf ๋‹น์‹ ์˜ ํ‘œํ˜„์€ ์ •ํ™•ํžˆ ๋‚ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ™์€ ํŽ˜์ด์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค.

x?: T ์™€ y: ?T ์˜ ์ฐจ์ด์ ์€ ํˆดํŒ/ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ์‚ฌ์šฉ๋œ ํƒ€์ดํ•‘ ๋ฐ ๊ฐ€๋“œ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ์  ์ธ์ˆ˜๋กœ ์„ ์–ธํ•˜๋ฉด ๋„๊ตฌ ์„ค๋ช…/ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ•์ด ๋ณ€๊ฒฝ๋˜์–ด ์„ ํƒ ์‚ฌํ•ญ์ž„์„ ๋ถ„๋ช…ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
a?: T ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋น„์›Œ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ ์–ธ์— ?: ๊ฐ€ ์—†์œผ๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•˜๋ฉฐ ๋น„์›Œ ๋‘˜ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

w: T ๋Š” void ์•„๋‹Œ ํ•„์ˆ˜ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค( --noImplicitVoid ).
๊ฒฝ๋น„์›์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

x?: T ๋Š” ์„ ํƒ์  ์ธ์ˆ˜์ด๋ฏ€๋กœ ์œ ํ˜•์€ ์‹ค์ œ๋กœ T | undefined
if (typeof x !== 'undefined') ๊ฒฝ๋น„์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
ํŠธ๋ฆฌํ”Œ ๊ทธ๋ž˜ํ”„ ์ฐธ๊ณ  !== ์— ์ •ํ™•ํ•œ ๊ฒ€์‚ฌ๋ฅผ์œ„ํ•œ undefined .

y: ?T ๋Š” ํ•„์ˆ˜ ์ธ์ˆ˜์ด๋ฉฐ ์œ ํ˜•์€ ์‹ค์ œ๋กœ T | void
if (y == null) ๊ฒฝ๋น„์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
null ๋ฐ undefined ์ฆ‰ void ๋ชจ๋‘์™€ ์ผ์น˜ํ•˜๋Š” ์ด์ค‘ ๋ฌธ์ž == ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค.

z?: ?T ์„ ํƒ์  ์ธ์ˆ˜์ด๋ฉฐ, ์ข…๋ฅ˜๋Š” ์ •๋ง T | undefined | void ์ด๋Š” T | void
if (z == null) ๊ฒฝ๋น„์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
null ๋ฐ undefined ์ฆ‰ void ๋ชจ๋‘์™€ ์ผ์น˜ํ•˜๋Š” ์ด์ค‘ ๋ฌธ์ž == ๋‹ค์‹œ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค.

๋ชจ๋“  ์„ ํƒ์  ์ธ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ ํƒ์  ์ธ์ˆ˜ ๋’ค์— ์˜ค๋Š” ํ•„์ˆ˜ ์ธ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฐจ์ด๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์„ ํƒ์  ์ธ์ˆ˜์— ๋Œ€ํ•ด null ๊ฐ€๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€๋งŒ ์ฃผ์š” ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ null ๊ฐ’์„ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฅผ ํ˜ธ์ถœ; ๊ทธ๋Ÿฌ๋‚˜ undefined ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ์‹ค์ œ๋กœ ์ž๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ํ˜„์žฌ ์„ ํƒ์  ์ธ์ˆ˜ ๊ตฌ๋ฌธ์„ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ z ํ˜•์‹์ด ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋ฌธ๊ตฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ผ๋ถ€ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

@jods4 ๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•œ ๋ชจ๋“  ๊ฒƒ์— ๊ฑฐ์˜ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” void ๊ฐ€ ์•„๋‹Œ ํƒ€์ดํ•‘์˜ ์ค‘์š”์„ฑ์„ ๊ฒฝ์‹œํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ํ•œ ๋‹จ๊ณ„์”ฉ ๋ฐ€์–ด๋ถ™์ด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. TS ํŒ€์ด ๋‚˜์ค‘์— ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ๋” ๋‚˜์€ ์ƒํƒœ์ด๋ฉฐ ๋” ๋งŽ์€ ๊ฒ€์‚ฌ์™€ ?T ๋ฅผ ๊ตฌํ˜„ํ•œ ํ›„ ๋‚˜์ค‘์— ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ž„๋ฌด๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Arrays ๋Š” ์ฐธ์œผ๋กœ ๊นŒ๋‹ค๋กญ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

``` .ts
ํ•จ์ˆ˜ numToString(x: ์ˆซ์ž) {
๋ฐ˜ํ™˜ x.toString();
}
var ์ˆซ์ž: number[] = Array(100);
numToString(์ˆซ์ž[0]); // ๋งํ–ˆ์–ด!

You can try to do something specifically for uninitialized arrays, like typing the `Array` function as `Array<?T>` / `?T[]` and upgrading it to `T[]` after a for-loop initializing it, but I agree that you can't catch everything. That said, that's already a problem anyway, and arrays typically don't even send uninitialized values to `map`/`filter`/`forEach`.

Here's an example -- the output is the same on Node/Chrome/IE/FF/Safari.

``` .ts
function timesTwo(x: number) {
    return x * 2;
}
function all(x) {
    return true;
}
var nums: number[] = Array(100);
nums.map(timesTwo);
// [undefined x 100]
nums.filter(all);
// []
nums.forEach(function(x) { console.log(x); })
// No output

๊ทธ๊ฒƒ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋‹ค์ง€ ๋„์›€์ด ๋˜์ง€๋Š” ์•Š์ง€๋งŒ ์˜ค๋Š˜๋‚  ์‹ค์ œ JavaScript์˜ ์˜ค๋ฅ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์€ ์œ ์ผํ•œ ๋‹ค๋ฅธ ์ ์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋„ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์„ ํ†ตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ •์  ๋ถ„์„์„ ํ†ตํ•ด ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…๊ณผ ๋…ธ๋ ฅ์„ ๋“ค์ผ ๋ฟ์ด์ง€๋งŒ ์ด๋ฏธ ์ง€๊ธˆ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š” ์ผ๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. --noImplicitVoid ๊ฐ€ ๊บผ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

``` .ts
์ธํ„ฐํŽ˜์ด์Šค ITransform{
(x: T): U;
}

์ธํ„ฐํŽ˜์ด์Šค IHaveName {
์ด๋ฆ„: ๋ฌธ์ž์—ด;
}

ํ•จ์ˆ˜ ๋ณ€ํ™˜(x: T, fn: ITransform) {
๋ฐ˜ํ™˜ fn(x);
}

var ์ด๋ฆ„ = {
์ด๋ฆ„: "ํ‘ธ"
};

var ์ž˜๋ชป๋œ ์ด๋ฆ„ = {
์ด๋ฆ„: 1234
};

var ์ด๋ฆ„์ด ๋„ = {
์ด๋ฆ„: null
};

var someFun = (x: IHaveName) => x.name;
var someFunHandlesVoid = (x: IHaveName) => {
if (x != null && x.name != null) {
x.name์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
}
"์ด๋ฆ„ ์—†์Œ"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
};

All of the above code compiles just fine -- no issues. Now let's try using it

``` .ts
someFun(named);
// "Foo"
someFun(wrongName);
// error TS2345: Argument of type '{ name: number; }' is not assignable to parameter
// of type 'IHaveName'.
//   Types of property 'name' are incompatible.
//     Type 'number' is not assignable to type 'string'.
someFun(null);
// Not currently an error, but would be something like this:
// error TS#: Argument of type 'null' is not assignale to parameter of type 'IHaveName'.
someFun(namedNull);
// Not currently an error, but would be something like this:
// error TS#: Argument of type '{ name: null; }' is not assignable to parameter of
// type 'IHaveName'.
//   Types of property 'name' are incompatible.
//     Type 'null' is not assignable to type 'string'.

someFunHandlesVoid(named);
// "Foo"
someFunHandlesVoid(wrongName);
// error TS2345: Argument of type '{ name: number; }' is not assignable to parameter
// of type 'IHaveName'.
someFunHandlesVoid(null);
// "No Name"
someFunHandlesVoid(namedNull);
// "No Name"

transform(named, someFun);
// "Foo"
transform(wrongName, someFun);
// error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage.
// Consider specifying the type arguments explicitly.
//   Type argument candidate '{ name: number; }' is not a valid type argument because it
//   is not a supertype of candidate 'IHaveName'.
//     Types of property 'name' are incompatible.
//       Type 'string' is not assignable to type 'number'.
transform(null, someFun);
// Not currently an error, but would be something like this:
// error TS#: The type argument for type parameter 'T' cannot be inferred from the usage.
// Consider specifying the type arguments explicitly.
//   Type argument candidate 'null' is not a valid type argument because it
//   is not a supertype of candidate 'IHaveName'.
transform(namedNull, someFun);
// Not currently an error, but would be something like this:
// error TS#: The type argument for type parameter 'T' cannot be inferred from the usage.
// Consider specifying the type arguments explicitly.
//   Type argument candidate '{ name: null; }' is not a valid type argument because it
//   is not a supertype of candidate 'IHaveName'.
//     Types of property 'name' are incompatible.
//       Type 'string' is not assignable to type 'null'.

transform(named, someFunHandlesVoid);
// "Foo"
transform(wrongName, someFunHandlesVoid);
// error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage.
// Consider specifying the type arguments explicitly.
//   Type argument candidate '{ name: number; }' is not a valid type argument because it
//   is not a supertype of candidate 'IHaveName'.
transform(null, someFunHandlesVoid);
// "No Name"
transform(namedNull, someFunHandlesVoid);
// "No Name"

๋ชจ๋“  ๊ฒƒ์„ ์žก์„ ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋งŽ์€ ๊ฒƒ์„ ์žก์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋งž์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์ฐธ๊ณ  ์‚ฌํ•ญ -- --noImplicitVoid ๊ฐ€ ์ผœ์ ธ ์žˆ์„ ๋•Œ ์œ„์˜ ๋™์ž‘์€ ๋ฌด์—‡์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด์ œ someFun ๋ฐ someFunHandlesVoid ๋Š” ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์œ ํ˜• ๊ฒ€์‚ฌ๋˜๊ณ  someFun ์ƒ์„ฑํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. someFunHandlesVoid ๊ฐ€ void ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋”๋ผ๋„ null ๋˜๋Š” undefined ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ช…์—๋Š” void ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. null ๋˜๋Š” undefined ๋ฅผ ์ˆ˜๋ฝํ•˜๋ ค๋ฉด (x: ?IHaveName) : string ๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ด์ „๊ณผ ๊ฐ™์ด ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€ ๋ถ€๋ถ„์ด์ง€๋งŒ, ๊ทธ๊ฒƒ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์•ผ ํ•  ์ผ์€ ํƒ€์ž… ์„œ๋ช…์— ๋‹จ์ผ ๋ฌธ์ž ? ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฒฝ๊ณ ์™€ ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ --warnImplicitVoid ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฒœ์ฒœํžˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ผ์„ ํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ๋ฐ”๋ณด ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ค์ง€๋งŒ, ๋‚˜๋Š” ํ•˜๋‚˜์˜ ํฌ์ŠคํŠธ๋ฅผ ๋” ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์ง„ํ–‰ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š”:

  • ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ณ„์† ๋…ผ์˜/๋ช…์‹œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
  • ์ด๊ฒƒ์„ ์„ธ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ œ์•ˆ์œผ๋กœ ๋ฐ”๊พธ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

    • ํ–ฅ์ƒ๋œ ๋ถ„์„

    • ๋ฏธ์ •/์˜ต์…˜ ์œ ํ˜• ?T

    • --noImplicitVoid ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜

  • ์ž…๋ ฅ์„ ์œ„ํ•ด TypeScript ํŒ€์›์„ ํ•‘ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” TypeScript ํŒ€์— ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ธด์ง€ ๊ณ ๋ คํ•˜์—ฌ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋”ฐ๋ผ์žก์œผ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋น„์ธ๊ฐ„์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ์ œ์•ˆ์— ๊ธฐ๋Œ€๊ณ  ๊ฑฐ๊ธฐ์—์„œ ๊ณ„์† ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@tejacques

  • dallonf์— ๋Œ€ํ•œ ์‚ผ์ค‘ ๊ฐ™์Œ ์˜ˆ์—์„œ typeof ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • jods4์— ๋Œ€ํ•œ ์˜ˆ์ œ์—์„œ ์ผ๋ถ€ ? ๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด์šฉ์ด ์ด ์Šค๋ ˆ๋“œ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋งŒํผ ์ด ์Šค๋ ˆ๋“œ๋Š” ๋” ์ด์ƒ "๊ฐ์‹œ"๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๊ฐ€๋” ์ณ๋‹ค๋ณด๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•  ์ˆ˜ ์žˆ์Œ). ๋”ฐ๋ผ์„œ ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ฒฌ์ธ๋ ฅ์„ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค์ด ๋จธ๋ฆฌ๋ฅผ ๋“ค๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ๋จผ์ € ์ œ๊ณตํ•  ๋•Œ๊นŒ์ง€ ๋ฉฐ์น /์ผ์ฃผ์ผ์„ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค. ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์ œ์•ˆ์ด ๊ฝค ๊ฒฌ๊ณ ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๊ธฐ์–ต๋œ ๋งˆํฌ๋‹ค์šด์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์ฝ”๋ฉ˜ํŠธ๋Š” ํ˜„ ๋‹จ๊ณ„์—์„œ ๋งค์šฐ ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. TypeScript ํŒ€์ด ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ œ์•ˆ์ด ๋งŒ๋“ค์–ด์ง€๋”๋ผ๋„(๋‚˜๋Š” 8์›”์— ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค) ์†Œ์Œ ์†์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์€ ์ฃผ์˜ ์ˆ˜์ค€์ด TypeScript ํŒ€์ด ์ž์‹ ์˜ ์ œ์•ˆ์„ ์ œ์‹œํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์žŠ์–ด ๋ฒ„๋ฆฌ๊ณ  Flow๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์„ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ +1์ด ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” --noImplicitVoid ์˜ต์…˜์ด
nullable ํ˜•์‹์ด ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ตฌ๋ฌธ๊ณผ ์˜๋ฏธ์— ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
nullable ์œ ํ˜•์ด๋ฏ€๋กœ ๋ˆ„๊ตฐ๊ฐ€ ์ œ์•ˆ ๋ฐ ๊ตฌํ˜„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด
๊ทธ ์ค‘ ํ™ฉ๊ธˆ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ์ ˆ์ฐจ์—์„œ ์ œ์•ˆ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์œ ํ˜•์˜ ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด์„œ๋Š”
๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋กœ ์ธํ•ด ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.

2015๋…„ 11์›” 18์ผ ์ˆ˜์š”์ผ 21:24 Tom Jacques [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด๊ฑฐ ํ•˜๊ธฐ์—” ์™„์ „ ๋ฐ”๋ณด๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ค์ง€๋งŒ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค๊ฒŒ
๊ฒŒ์‹œํ•˜๋‹ค.

์ด ์‹œ์ ์—์„œ ์ง„ํ–‰ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
์šฐ๋ฆฌ๋Š”:

  • ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ณ„์† ๋…ผ์˜/๋ช…์‹œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
  • ์ด๊ฒƒ์„ ์„ธ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ œ์•ˆ์œผ๋กœ ๋ฐ”๊พธ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

    • ํ–ฅ์ƒ๋œ ๋ถ„์„

    • ์•„๋งˆ๋„/์˜ต์…˜ ์œ ํ˜• ?T

    • --noImplicitVoid ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜

  • ์ž…๋ ฅ์„ ์œ„ํ•ด TypeScript ํŒ€์›์„ ํ•‘ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ƒˆ๋กœ์šด ์ œ์•ˆ์— ๋Œ€ํ•ด ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ ์ดํ›„๋กœ ๊ณ„์† ํ† ๋ก ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
TypeScript ํŒ€์— ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋”ฐ๋ผ์žก์œผ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋น„์ธ๊ฐ„์ ์ž…๋‹ˆ๋‹ค.
๊ธฐ๊ฐ„์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/185#issuecomment -157928828
.

--noImplicitNull ์˜ต์…˜์— ๋Œ€ํ•ด +1(๋ฌดํšจ ๋ฐ null ํ• ๋‹น ํ—ˆ์šฉ ์•ˆ ํ•จ).

ํŠน์ˆ˜ ์œ ํ˜• Op<A> = A | NullType ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฝค ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ

_--noImplicitNull_๋„ +1:+1:

--noImplicitNull์˜ ๊ฒฝ์šฐ +1

๋‹ซํ˜€์•ผ ํ•˜๋‚˜์š”?

@Gaelan Given #7140์ด ๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋ช‡ ์‚ฌ๋žŒ์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ --noImplicitNull ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ „์šฉ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜๋ ค๋ฉด ์ง€๊ธˆ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@isiahmeadows ๊ทธ๋Ÿฌ๋ฉด ์ด๊ฒƒ์„ ์—ด์–ด ๋‘๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ซํ˜€์•ผ ํ•˜๋‚˜์š”?

https://github.com/Microsoft/TypeScript/issues/2388 ์ด ์ด ์ž‘์—…์˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์•„์ง ์ด ๊ธฐ๋Šฅ์„ ์™„๋ฃŒํ–ˆ๋‹ค๊ณ  ์„ ์–ธํ•˜์ง€ ์•Š์€ ์ด์œ ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋ช‡ ์‚ฌ๋žŒ์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ --noImplicitNull ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ „์šฉ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜๋ ค๋ฉด ์ง€๊ธˆ ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ƒˆ ํ”Œ๋ž˜๊ทธ์˜ ์š”์ฒญ๋œ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ช…ํ™•ํ•œ ์ œ์•ˆ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@mhegazy ์ด๋ฒˆ ํ˜ธ ์•ž๋ถ€๋ถ„์—์„œ --noImplicitNull ์— ๋Œ€ํ•ด ์ œ์•ˆํ•œ ์•„์ด๋””์–ด๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋ช…์‹œ์ ์œผ๋กœ ?Type ๋˜๋Š” !Type ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. IMHO ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด ์•„๋‹Œ ์œ ํ˜• ์ž์ฒด๊ฐ€ ์žˆ์„ ๋•Œ IIRC๊ฐ€ ์ด๋ฏธ ๊ตฌํ˜„๋˜์—ˆ๋‹ค๋Š” ๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒ์šฉ๊ตฌ์˜ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

#7140๊ณผ #8010์ด ๋ชจ๋‘ ๋ณ‘ํ•ฉ๋˜์–ด ์ด์ œ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๋งˆ๊ฐ๋œ ์ด์Šˆ์— ๋Œ€ํ•ด ๋Œ“๊ธ€์„ ๋‹ฌ๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋””์— ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋” ์ข‹์€ ๊ณณ์ด ์—†๊ณ  ๊ด€์‹ฌ์ด ์—†๋‹ค๋ฉด ์ƒˆ๋กœ์šด ์ด์Šˆ๊ฐ€ ๋  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ผ๋ณ„๋กœ ์•”์‹œ์  null์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?
์˜ˆ๋ฅผ ๋“ค์–ด, noImplicitNull์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŽ์€ td ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ(๊ทธ๋“ค์€ ํ™•์‹คํžˆ ์œ ํ˜•์ด ์ง€์ •๋˜์–ด ์žˆ๊ณ  ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ƒ๊ฐ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—) ๋‚ด ์†Œ์Šค๋ฅผ implicitNull๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?
์•„๋ฌด๋„ ์ด๊ฒƒ์„ ์œ ์šฉํ•˜๊ฒŒ ์ƒ๊ฐํ• ๊นŒ์š”?

@massimiliano-mantione, https://github.com/Microsoft/TypeScript/issues/8405 ๋ฅผ ์ฐธ์กฐ

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