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
๋ณธ์ง์ ์ผ๋ก 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
๋ ๋ชจ๋ ์ ํ์ ํ ๋นํ ์ ์์ต๋๋ค.? 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์ ์ฌ์ฉํ ์ ์์ต๋๋ค.๊ทธ๋ฐ ๋ค์ ๋ชจ๋ ๊ณณ์์ 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์์ ๋ ์ง๋ฅผ ์ง๋ ฌํํ ๋๋ง ๋ฐํ๋ฉ๋๋ค.
์ ํ ์ฌ์ค์ด ์๋๋๋ค.
console.log(window.document.getElementById('nonExistentElement')); // 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
)๋ฅผ ์์ฑํ์ฌ ์ฝ๋ ๊ฐ๋
์ฑ์ ํจ์ฌ ๋จ์ด๋จ๋ฆด ๊ฒ์
๋๋ค.!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
!string|null
๋ก ์์ฑํ ๊ฒ์ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ null์ด _like_ {}(ํ์ง๋ง ํ ๋นํ ์ ์์) ์ฒ๋ฆฌ๋ ๊ฒฝ์ฐ ํ์ฌ ์์คํ
์์ ์๋ํฉ๋๋ค.string|null
์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ฉด ์ด ๊ฒฝ์ฐ null์ ๋ฌด์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Null ๋ฐ undefined๋ ๋ชจ๋ non-null ๋ฐ non-undefined ์์ ! ๊ทธ๋ฆฌ๊ณ any๋ any๊ฐ ์๋๋๋ค(์ปดํ์ผ๋ฌ ๊ฒฝ๊ณ /์ค๋ฅ์ผ ์ ์์).ํธ์ง: 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'
์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.๋ค์ ๋งํ์ง๋ง ์๋ฒฝํ์ง๋ ์์ง๋ง ๋ ๋์ ๋์์ด ๋ณด์ด์ง ์์ต๋๋ค.
๋ถ๋ช ํ ํ์๋ฉด, ๋ด๊ฐ ๋ณผ ์ ์๋ (๋ฐ๋ก ์ดํ) ๋ด๊ฐ ์ ์ํ ๊ฒ์ ๋ํ ๊ทํ์ ์ ์ผํ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
var mystring = "string"
๋ํ ๋์์ด ๋ฌด์์ธ์ง ์ ์ ์์ต๋๋ค.๊ทธ๋ฆฌ๊ณ ์ง์นจ์ ๋ํ ๋์ ์ฐ๋ ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์งํ "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๊ฐ์ง ์คํ ๊ฐ๋ฅํ ์๋ฃจ์ ์ด ์์ต๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๊น๋ฐ์ ๋์๊ฒ ์์ ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
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
์ ์กฐํ๋ฅผ ์ด๋ฃจ๊ธฐ ์ํด). . ์ด๊ฒ์ ๋ํ ์ฌ์ฉ์์๊ฒ ์๋ฏธ๊ฐ ์๋ ํด์์ด ๋ ๊ฒ์
๋๋ค(์ฆ, "๋ช
์์ ์ผ๋ก ๋งํ ๋ด์ฉ์ ์์์ ์ผ๋ก ๋งํ ๋ด์ฉ๋ณด๋ค ์ฐ์ ํด์ผ ํจ"). ์ด ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์์๋ ํ๋๊ทธ์ ๋ค๋ฅธ ์ ์ฌํ ๋ฌธ์ ๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ์ฌ์๊ณผ ๊ตฌํ ๋ชจ๋์ ์ฝ๊ฐ์ ํดํน ๋ณต์ก์ฑ์ ์ถ๊ฐํฉ๋๋ค.
string|null|undefined
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๋ด ์ ์์ ๋ช
์์ ์ด๋ฏ๋ก ์๋ตํ์ต๋๋ค.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
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
๋ค์๊ณผ ๊ฐ์ ์ฐจ์ด์ ์ด ์์ง๋ง ์์ ๋ด ์๊ฒฌ๊ณผ ๋๋ถ๋ถ ๋์ผํฉ๋๋ค.
!T
๋์ T!
.์์ ๋กญ๊ฒ ์๊ฒฌ์ ์ ์ํ๊ณ , ํฌํฌํ๊ณ , ๋์ ์ ์์ ๋ง๋์ญ์์ค( ?T
).
์์ผ๋ก ๋์๊ฐ๋๋ก ๋
ธ๋ ฅํฉ์๋ค.
@jods4
๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ ๋ฒ์งธ ๊ณผ๋ถํ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์์ ์ฌํญ์ด ํจ๊ณผ๊ฐ ์์์ ์๋ฏธํ๋ ๊ฒ์ ๋ฌด์์ ๋๊น?
- ์ด๋ ๋ ํ๋๊ทธ์ ๋ํด ์ธ์ด ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ผ๊ด๋๊ฒ ๋ง๋ค๊ธฐ ์ํด ์ค๋ฒ๋ก๋ ํด๊ฒฐ์ด ๋ณ๊ฒฝ๋์์์ ์๋ฏธํฉ๋๋ค.
์, ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ค๋ฅ ์์ด ์ปดํ์ผ๋์ง๋ง ๋์ผํ ๊ฒฐ๊ณผ๋ ์๋๋๋ค. sumWordCounts()๋ ์ซ์๋ก ์ ๋ ฅ๋ฉ๋๋ค! ํ๋์ ๊ฒฝ์ฐ์ ์ซ์๋ก? ๋ ๋ฒ์งธ์์. ์ค์์น๋ก ์ฝ๋์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋งค์ฐ ๋ฐ๋์งํ์ง ์์ต๋๋ค. ์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ์ด ๋ณ๊ฒฝ์ ์ค๋ฒ๋ก๋ ํด๊ฒฐ๊ณผ ๊ฐ์ ์ ์ญ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ๋ด ์ ์์
number!
์ด ์์ต๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ ํ์ ๋จ์ํnumber
์ ๋๋ค. ์ฆ, null ๊ฐ์ ์ ์ธํ๊ณ ์ค๋ฒ๋ก๋ ํด๊ฒฐ์ด ๊ณ์ ์ ์์ ์ผ๋ก ์๋ํจ์ ์๋ฏธํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ช ์์ null์ ๋ํ ์๋ก์ด ๋์์ด ์์์ null๋ณด๋ค ์ฐ์ ํ์ฌ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ฐฉ์์ผ๋ก ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ ๊ทํํฉ๋๋ค.
์๋! ์ด๊ฒ์ด ์์ ์ ๋๋ค. ์ ์ฌ์ ์ผ๋ก null ๊ฐ์ ์ฌ์ฉํ ๋ ์ปดํ์ผ๋ฌ๊ฐ ๋์๊ฒ ์ค๋ฅ๋ฅผ ๋์ง๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๋ด๊ฐ ์ฝ๋ฉํ ๋์ฒ๋ผ null์ด ์๋๋ผ๊ณ "๊ฐ์ "ํ๋ค๋ฉด ์ด ๊ธฐ๋ฅ์ ์ธ๋ชจ๊ฐ ์์ต๋๋ค!
- ๋ด๊ฐ ํํํ๋ ค๊ณ ํ๋ ์์ ์ (์ ํ ์ ์ธ ์ธก๋ฉด์์) ๊ธฐ๋ฅ์ ํ์ ํธํ์ฑ์ด ๊ฑฐ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ด์ ๊ณผ ๋๊ฐ์ ๋์์ ํ๊ฒ ๋ฉ๋๋ค. 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์ด ์๋ ์ฃผ์์ด ๊ฑฐ์ ํ์ํ์ง ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ _ํ๋์_ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค. ๊ทธ๋ ์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ฝ๋ ๊ธฐ๋ฐ์ ๊ฐ์ ธ์์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ด ์ ์์ผ๋ก ์ปดํ์ผํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
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๊ฐ ์ด์์ ๋๊ธ์ด ์๋ง๋ ๋๋ฌด ๋ง๋ค๋ ์ฌ์ค์ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ง๋ ์ฌ๊ธฐ์ ํ ๋ก ํ๋ ๋ ๊ทธ๋ฃน์ ์ฌ๋๋ค์ด ์๊ธฐ ๋๋ฌธ์ผ ๊ฒ์
๋๋ค.
๊ทธ ๋ ๊ทธ๋ฃน์ ์ฌ๋๋ค์ ์ค๋ซ๋์ ์๋ก์ ์ฃผ์ฅ์ ๊ท๋ฅผ ๊ธฐ์ธ์ด์ง ์๊ณ ๋ฉ์ถ์๊ณ ๊ฒฐ๊ตญ ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ 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()๋ฅผ ํธ์ถํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์ถ์ต๋๋ค.
@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 , ๊ทธ ๊น๋ฐ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ๊ถ๊ธํฉ๋๋ค.
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์ ์ ์ ์ ํ ์์คํ
์ ๋ํด ์๋ฌด ๊ฒ๋ ์์ํด์๋ ์ ๋ฉ๋๋ค.
์์ด๋ฌ๋๋ฅผ ์ค๋ช ํด์ผ ํ๋ค๋ ๊ฒ์ด ์กฐ๊ธ ์ฌํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
null
var s:string = null
)์ ์ง์ํฉ๋๋ค.void
์ ํ์ ๋ง๋ค๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก T|void
๋ฉ์๋์ ์์ฑ์ ํ์ฉํ์ง ์์ต๋๋ค.์ฃผ์ฅ์ (3)์ ๋ง๋ ์๋๋ ๋ฐ๋ฉด (2)๋ ๊ทธ๋ ์ง ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ์์ด๋ฌ๋ํ ๋ถ๋ถ์ด ๋ณด์ด์๋์? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์๋ฅผ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค.
{}
var s:string = {}
)์ ํ ๋นํ ์ ์๋ ์ ํ ์์คํ
์ ๋ง๋ญ๋๋ค.{}
๊ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ฝํ๊ณ ๋ช ๊ฐ์ง ๋ด์ฅ๋ ๊ฒ ์ธ์๋ ๋ฉ์๋๋ ์์ฑ์ ํ์ฉํ์ง ์๋ {}
์ ํ์ด ์์ผ๋ฉฐ 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๋ณด๋ค ํจ์ฌ ๋ ์ ์๋ํ๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์์ต๋๋ค.
let foo: T = expect(possiblyNullFoo)
๋๋ let foo:T = possiblyNullFoo!
์๋ง๋ ๋๊ตฌ๊ฐ ์์ง ์ ์ฉ๋์ง ์์ ์ฝ๋์ ์ฌ์ฉ์ ์ฝ๊ฒ ํ๊ธฐ ์ํด ํน์ ๋ชจ๋์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ๋นํ์ฑํํ๋ ๊ฒ์ ๋์ ํ ๊ฐ์น๊ฐ ์์ ์๋ ์์ต๋๋ค.
์ด์ ์๊ฒฌ์์ ์ธ์ด ๋ถํ ์ ํผํ๊ธฐ ์ํด ์ผ๋ฐ 'T'์ null ํ์ฉ ์ฌ๋ถ๋ฅผ ์ ํํ๋ ๋ชจ๋๊ฐ ์์ผ๋ฉฐ 6๋จ๊ณ๊ฐ ์ค์ฉ์ ์ด์ง ์์ ๊ฒฝ์ฐ์๋ 1-3๋จ๊ณ ์์ฒด๊ฐ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ด ์์์ ์๊ฐ:
expect()
๋ถ๋ถ์ ๋ณต์กํ ์ ์์ผ๋ฏ๋ก ์ ์๊ฐํด์ผ ํฉ๋๋ค. ํ ๋น๋ฟ๋ง ์๋๋ผ ์ธํฐํ์ด์ค, ์ ๋ค๋ฆญ ๋๋ ๋งค๊ฐ๋ณ์ ์ ํ...์ฆ, ์ฌ์ ํ 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๋ฅผ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ผ๋ก ์๊ฐํ๋ ๋ฐ ํฐ ๊ฒฐํจ์ด ์๋ค๊ณ ๋ด ๋๋ค...
- ๋์์ธ ํจํด์ ํตํด ADT๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค(๋ค์ดํฐ๋ธ
TypeScript์์ ์ง์)null
ํค์๋ ๊ธ์ง- null์ด ์ธ๋ถ์์ ์ฝ๋๋ก ๋์ถ๋ ์ ์๋ ๋ชจ๋ ์ฅ์๋ฅผ ๋ณดํธํ์ญ์์ค.
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๊ฐ์ง ๋ณ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์ ๊ณตํ๋ ๊ทธ๋ฌํ ํ๋์ ๋ชฉ์ ์ ์ค๋ฒ๋ก๋ํฉ๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ์ซ์ดํฉ๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ๊ฐ๊ฐ ๋ณ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ 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#์๋ int
์ ๊ฐ์ null์ด ์๋ ๊ฐ ์ ํ์ด ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ C# 2.0์์ int?
์ ๊ฐ์ nullable ๊ฐ ์ ํ์ ์ป์์ต๋๋ค. ์ฐธ์กฐ๋ ํญ์ null์ ํ์ฉํ์ง๋ง ์ด๋ฅผ ๋ณ๊ฒฝํ๊ณ ๋์ผํ ๊ตฌ๋ฌธ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ ์์ต๋๋ค. string
๋ null์ด ์๋๋ฉฐ string?
๋ null์ผ ์ ์์ต๋๋ค.
๋ฌผ๋ก ํฐ ๋ฌธ์ ๋ ์ด๊ฒ์ด string
์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ฝ๋๋ฅผ ์ค๋จํ๋ค๋ ๊ฒ์
๋๋ค. null
๋ฅผ string
์ ํ ๋น/๋ฐํํด๋ ๊ด์ฐฎ์์ง๋ง ์ด์ ๋ ์ค๋ฅ์
๋๋ค. C# ํ์ ์ฌ์ฉ์๊ฐ ์ตํธ์ธํ์ง ์๋ ํ ์ด๋ฌํ ์ค๋ฅ๋ฅผ "๋นํ์ฑํ"ํ ์๊ฐ์
๋๋ค. string?
์ฐ๋ ๊ฒ์ ํญ์ ์ค๋ฅ์
๋๋ค. ๊ตฌ๋ฌธ์ด ์๋กญ๊ณ ์ด์ ์๋ ํ์ฉ๋์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค(๋ฐ๋ผ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋).
๋ค๋ฅธ ๋ฌธ์ ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ผ ๋๋ ์ด์
๋ธ๋ฆฌ๋ณ๋ก ์ตํธ์ธ ํ๋๊ทธ๋ฅผ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ ์๊ฒฉํ ์ ํ ์์คํ
์ ์ ํํ๋ ์ธ๋ถ ์ฝ๋๊ฐ ์ด์ ์ ์ป๊ณ ์ด์ ๋ ๊ฑฐ์ ์ฝ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ณ์ ์๋ํฉ๋๋ค.
.d.ts
๋ํด์๋ ํญ์ ํ์ผ๋ณ๋ก ์์ด์ผ ํฉ๋๋ค.number
. ์๋ก์ด null
์ ํ์ด ์์ต๋๋ค.number?
๋ number | null
์ ๋ฐ๋ก ๊ฐ๊ธฐ์
๋๋ค.(x: string?) => x.length
์ ๊ฐ์ด nullable ์ ํ์ ๋ํ ์๋ก์ด ์ค๋ฅ๋ฅผ ๋์
ํฉ๋๋ค.let x: string = null;
ํ ๋น๊ณผ ๊ฐ์ nullable์ด ์๋ ์ ํ์ ๋ํ ์๋ก์ด ์ค๋ฅ๋ฅผ ๋์
ํฉ๋๋ค.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
๋ ์ฐ์ฐ ์๋์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐธ์กฐ: https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#324 -the-void-type
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
๊ณ์ ์ถ๋ก ํ๋ ๊ฒ์ด ์๋ง๋ ์ข์ ์ผ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
noImplicitAny
์๋์ ์ค๋ฅ์
๋๋ค.(): 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] ์ด๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ง๋๋ ํ๋๊ทธ๋ฅผ ๋์ ํ๋ ๊ฒ์ ์ค์ฉ์ ์ธ ์ด์ ๋ก ์ฒ์๋ถํฐ ์ ์๋ํ์ง ์์ ๊ฒ์ ๋๋ค.
์, ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด ๊ธฐ์กด ์ฝ๋ ๊ธฐ๋ฐ์์๋ ์ ์๋ํ์ง ์์ต๋๋ค. ํ์ง๋ง:
@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
) ๊ฐ์๊ธฐ ํด๋ฆญ
๋ณด๋ค
๋ด ๊ด์ ์์ ์ด๊ฒ์ 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์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ์์ด ๋ง์์ ๋ญ๋๋ค.
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์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ฝ๋์ ์ฝ๊ฒ ์๋ํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ ์ด๋ป์ต๋๊น?
T
๊ฐ !T
์ ๋ณ์นญ์ด ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด T
์ null ํ์ฉ ์ฌ๋ถ๋ฅผ ์ ์ ์์ต๋๋ค.<strong i="18">@ts</strong>:implicit_null
. ์ด๋ Flow๊ฐ ๋ชจ๋๋ณ๋ก ์ ํ ๊ฒ์ฌ๋ฅผ ํ์ฑํํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํฉ๋๋ค.๋ช ์์ 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
์ ๋์ผํฉ๋๋ค. ์ ์ธ์์ ์๋๋ฅผ ๋ ๋ช
์ํด์ผ ํฉ๋๋ค.
ํ ๋น๊ณผ ์ ์๋ ๋ถ๋ช ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝ๊ณ์ ๋ค๋ฅธ ์ชฝ์ ์์ ์ ์์ต๋๋ค.
์ค์ ๋ก, ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ธ๊ณผ ๋ด ์ฝ๋์์์ ์ฌ์ฉ. ์ง๊ธ:
x
๊ฐ null์ ํ์ฉํ์ง ์๋ ๊ฒ์ผ๋ก ํ์๋๋ฉด 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์ ๋ ์ ๊ณ ์์ธก ๊ฐ๋ฅํ ์ํฉ์์ ๋ฐ์ํฉ๋๋ค.
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
:
null
๋ณด๋ค delete
null
๋ก ์ค์ ํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์
๋๋ค.null
์ ์ํ์ง๋ง ๊ฐ์ด ์์์ ์๋ฏธํ๊ณ , undefined
... ์ ์๋์ง ์๋๋ค. ๋ ์ฌ์ด์ ์ฐจ์ด๊ฐ ๋ถ๋ช
ํ ๊ณณ: ์ ํ์ ๋งค๊ฐ๋ณ์. ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด undefined
๋ฉ๋๋ค. ์ฝ๋ ๊ธฐ๋ฐ์์ undefined
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋น ๊ฐ์ ์ด๋ป๊ฒ _pass_ํฉ๋๊น? null
์ฌ์ฉํด๋ ๋ฌธ์ ์์ต๋๋ค.undefined
์ค์ ๋ก ์ค์ฉ์ ์ด์ง ์์ ์ด ์ค๋ ๋์์ ๋
ผ์๋ ๊ฒ์ฒ๋ผ null ๊ฒ์ฌ์ ๋ํ ๊นจ๋ํ ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค. ๋น๋ก ๋ด๊ฐ ์ด๊ฒ์ ๋ํด ๊ณต์์ ํ๊ณ ์์์ง๋ ๋ชจ๋ฅด์ง๋ง.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์ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ํ๋ ์ด์ :
- ์ฐ๋ฆฌ ๊ฐ๋ฐ์๋ค์๊ฒ ์น์ํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ฉฐ ๋ง์ ์ฌ๋๋ค์ด ์ ์ OO์์ ๋์ต๋๋ค.
C#๊ณผ ๊ฐ์ ์ธ์ด.- ์ด๊ธฐํ๋์ง ์์ ๋ณ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋ ๋์๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๋ง์ ์ธ์ด, ์ JS์์ ๋ฌ๋ผ์ผ ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋์ ~์ ๋ง๋ค์ด๋ผ
์๋๊ฐ ๋ถ๋ช ํ๋ค.- JS๋ ๋์ ์ธ์ด์ด์ง๋ง ๋ค์์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ๋ ์ข์ต๋๋ค.
๋ณ๊ฒฝ๋์ง ์๋ ์ ์ ์ ํ. ์์ฑ์ ๋ค์์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ ๋๋ค.
์ญ์ ํ๋ ๊ฒ๋ณด๋ค null์ ๋๋ค.- ์ ์๋ null ์ฌ์ด์ ๋ช ํํ ์ฐจ์ด๋ฅผ ์ง์ํ์ง๋ง
๊ฐ์ ๋ถ์ฌ๋ฅผ ์๋ฏธํ๊ณ undefined๋... undefined๋ฅผ ์๋ฏธํฉ๋๋ค.
๋์ ์ฐจ์ด๊ฐ ๋ถ๋ช ํ ๊ณณ: ์ ํ ์ฌํญ
๋งค๊ฐ๋ณ์. ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด ์ ์๋์ง ์์ต๋๋ค. ๋น์ ์ ์ด๋ป๊ฒ
_pass_ ์ฝ๋์์ undefined๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋น ๊ฐ
๋ฒ ์ด์ค? null์ ์ฌ์ฉํ๋ฉด ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.- ์ด ํญ๋ชฉ์์ ๋ ผ์๋ ๊ฒ์ฒ๋ผ null ๊ฒ์ฌ์ ๋ํ ๊นจ๋ํ ๊ฒฝ๋ก๋ฅผ ์ ์ํฉ๋๋ค.
์ค๋ ๋๋ undefined๋ก ์ค์ ๋ก ์ค์ฉ์ ์ด์ง ์์ต๋๋ค. ์๋ง๋
๋๋ ์ด๊ฒ์ ๋ํด ๊ณต์์ ํ๊ณ ์๋ค.- ์ผ๊ด์ฑ์ ์ํด ์ ํํด์ผํฉ๋๋ค. 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์ด ์๋ ํ์์ ๊ฐ๊ธฐ ์ํด ํฉ์๊ฐ ํ์ํ ๋ ๊ฐ์ง ์ด๋ ค์ด ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ ๋ค ์์์ ๋ช ํํ ๊ฒฐ๋ก ์์ด ๊ธธ๊ฒ ๋ ผ์๋์์ต๋๋ค.
undefined
๋ฌด์์ ํ ๊น์? (๋ด ์๊ฒฌ: ์ฌ์ ํ ๋์ฒ์ ์๊ณ ํ์ธ๋์ง ์์)๋ด ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ 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์ด ์๋ ์ ํ์ ๊ฐ์ง๋ ค๋ฉด ํฉ์๊ฐ ํ์ํฉ๋๋ค.
๋ ๊ฐ์ง ๋ชจ๋ ๋ช ํํ ๊ฒฐ๋ก ์์ด ์์์ ๊ธธ๊ฒ ๋ ผ์๋์์ต๋๋ค.
- undefined๋ก ๋ฌด์์ ํฉ๋๊น? (๋ด ์๊ฐ: ์ฌ์ ํ ๋์ฒ์
๋ฐ ์ ํ ์ทจ์)- ํนํ ๊ธฐ์กด ์ฝ๋์์ ํธํ์ฑ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น?
์ ์? (๋ด ์๊ฒฌ: ์ต์ํ ์ ์ ํ์ผ๋น ์ตํธ์ธ ํ๋๊ทธ.
ํ๋๊ทธ๋ฅผ ์ผ๋ ๊ฒ์ 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์ ์์ต๋๋ค.
๋ด ์๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
null
)์ ์ง์ ํฉ๋๋ค.null
์์ any
ํ์ฅ ์ ๊ฑฐ ;T | null
์ ๋์ผํ ๊ตฌ๋ฌธ ์๊ธฐ T?
T | null
;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
.
๋ค์ ์์ ์ ์ํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ฐธ์ผ๋ก ๊ณผ๊ฐํ ๋ธ๋ ์ดํน ์ฒด์ธ์ง์ด๋ฉฐ ์ธ์ด์ ๋ ์ ํฉํด ๋ณด์
๋๋ค.
ํ๋.
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์ ํ์ฉํ์ง ์๋ ์ ํ๋ณด๋ค ํจ์ฌ ๋ ํฐ ๊ธฐ๋ฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ปดํ์ผ ํ์์ ๋ฐฐ์ด์ ๊ฒฝ๊ณ ๊ฒ์ฌ๊ฐ ์ ์ฉ๋์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ธ ๊ฐ์ง ์ต์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
[]
"method" ์๋ T?
์ ์ ํ ์๋ช
์ด ์์ต๋๋ค. ๊ฒฝ๊ณ ๊ฒ์ฌ ์ธ๋ฑ์ฑ๋ง ์ํํ๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์์ T?
๋ฅผ T!
๋ก ์บ์คํ
ํ ์ ์์ต๋๋ค.undefined
๋ฐํํ๊ณ ์ ํ ๊ฒ์ฌ๊ธฐ์ ์ํด ํฌ์ฐฉ๋์ง ์์ต๋๋ค.์ด๊ฒ๋ค์ ๋ชจ๋ ๊ฐ์ฒด์ ์์ฑ์ ๋ํ ์ธ๋ฑ์ค ๊ธฐ๋ฐ ์ก์ธ์ค์๋ ์ ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด 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 ๊ฐ์ ์ฌ์ฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์ด์ ๋ ๊ฐ์ง๋ฅผ ํ์ฉํฉ๋๋ค.
?T
์ ํ ๊ตฌ๋ฌธ์ ์ ์ง์ ์ธ ์ฑํ, ์ด ์ค ์ ํ์ ๋งค๊ฐ๋ณ์๋ ์ด๋ฏธ ๊ต์ฒด๋์์ต๋๋ค.--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 ๊ฐ.์ด์ ๋ ๊ฐ์ง๋ฅผ ํ์ฉํฉ๋๋ค.
- ์ ํ ์ฌํญ์ธ ?T ์ ํ ๊ตฌ๋ฌธ์ ์ ์ง์ ์ฑํ
๋งค๊ฐ๋ณ์๋ ์ด๋ฏธ ๊ต์ฒด๋์์ต๋๋ค.- ์์ผ๋ก ์ปดํ์ผ๋ฌ ํ๋๊ทธ --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๋ถ:
?T
์ ํ์ ์ถ๊ฐํ์ญ์์ค. ์ด๊ฒ์ ์ค์ ๋ก ์ธ์ด ์์ค ์ต์
์ ํ์ ๋ํ ๊ตฌ๋ฌธ์์ ์คํ์
๋๋ค.๋ ๋ฒ์งธ ๋ถ๋ถ:
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 {
์ด๋ฆ: ๋ฌธ์์ด;
}
ํจ์ ๋ณํ
๋ฐํ 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 ํ์ ์ด ์ค๋ ๋๊ฐ ์ผ๋ง๋ ๊ธด์ง ๊ณ ๋ คํ์ฌ ์ด ์ค๋ ๋๋ฅผ ๋ฐ๋ผ์ก์ผ๋ผ๊ณ ์์ฒญํ๋ ๊ฒ์ ๊ฑฐ์ ๋น์ธ๊ฐ์ ์ด๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ ์์ ๊ธฐ๋๊ณ ๊ฑฐ๊ธฐ์์ ๊ณ์ ๋ ผ์ํ๊ณ ์์ต๋๋ค.
@tejacques
typeof
๊ฐ ๋๋ฝ๋์์ต๋๋ค.?
๊ฐ ๋๋ฝ๋ ๊ฒ ๊ฐ์ต๋๋ค.๋ด์ฉ์ด ์ด ์ค๋ ๋์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ๋งํผ ์ด ์ค๋ ๋๋ ๋ ์ด์ "๊ฐ์"๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค(๊ฐ๋ ์ณ๋ค๋ณด๋ ๊ฒ๊ณผ ๋น์ทํ ์ ์์). ๋ฐ๋ผ์ ๋ช ๊ฐ์ง ์๋ก์ด ์ค๋ ๋๋ฅผ ๋ง๋๋ ๊ฒ์ ํ์คํ ๊ฒฌ์ธ๋ ฅ์ ๊ตฌ์ถํ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๋๋ค์ด ๋จธ๋ฆฌ๋ฅผ ๋ค๊ณ ํผ๋๋ฐฑ์ ๋จผ์ ์ ๊ณตํ ๋๊น์ง ๋ฉฐ์น /์ผ์ฃผ์ผ์ ๊ธฐ๋ค๋ฆฌ์ญ์์ค. ๋น์ ์ ๋น์ ์ ์ ์์ด ๊ฝค ๊ฒฌ๊ณ ํ๊ธฐ๋ฅผ ์ํ ๊ฒ์
๋๋ค.
ํธ์ง: ๊ธฐ์ต๋ ๋งํฌ๋ค์ด์ด ์กด์ฌํฉ๋๋ค.
์ด ์ค๋ ๋์ ๋ํ ์ฝ๋ฉํธ๋ ํ ๋จ๊ณ์์ ๋งค์ฐ ๋ฌด์๋ฏธํฉ๋๋ค. 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 ๋ฅผ ์ฐธ์กฐ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ง๊ฐ๋ ์ด์์ ๋ํด ๋๊ธ์ ๋ฌ๋ฉด ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์ด๋์ ๋ฌผ์ด๋ณผ ์ ์๋ ๋ ์ข์ ๊ณณ์ด ์๊ณ ๊ด์ฌ์ด ์๋ค๋ฉด ์๋ก์ด ์ด์๊ฐ ๋ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ผ๋ณ๋ก ์์์ null์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๊น?
์๋ฅผ ๋ค์ด, noImplicitNull์ ์ฌ์ฉํ์ฌ ๋ง์ td ํ์ผ์ ์ฒ๋ฆฌํ์ง๋ง(๊ทธ๋ค์ ํ์คํ ์ ํ์ด ์ง์ ๋์ด ์๊ณ ๊ทธ๋ฐ ์์ผ๋ก ์๊ฐ๋์๊ธฐ ๋๋ฌธ์) ๋ด ์์ค๋ฅผ implicitNull๋ก ์ฒ๋ฆฌํฉ๋๊น?
์๋ฌด๋ ์ด๊ฒ์ ์ ์ฉํ๊ฒ ์๊ฐํ ๊น์?