์ ๋ฐ์ดํธ : ๋ด ์ต์ ์ ์์ https://github.com/Microsoft/TypeScript/issues/13778#issuecomment -406316164 ์๊ฒฌ
strictNullChecks
ํ์ฑํ๋๋ฉด TypeScript๋ ์ธ๋ฑ์ค ์๋ช
(์: ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด)์ undefined
๋ฅผ ํฌํจํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ ์๋ ค์ง ๊ฒฝ๊ณ ์ด๋ฉฐ ์ฌ๋ฌ ๋ฌธ์ , ์ฆ https://github.com/Microsoft/TypeScript/issues/9235 , https://github.com/Microsoft/TypeScript/issues/13161 , https://github ์์ ๋
ผ์๋์์ต๋๋ค https://github.com/Microsoft/TypeScript/pull/7140#issuecomment -192606629.
์์:
const xs: number[] = [1,2,3];
xs[100] // number, even with strictNullChecks
๊ทธ๋ฌ๋ ์์ ๋ฌธ์ ๋ฅผ ์ฝ์ผ๋ฉด ๋ง์ TypeScript ์ฌ์ฉ์๊ฐ ๊ทธ๋ ์ง ์๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๋ฌผ๋ก ์ธ๋ฑ์ค ์๋ช
์ undefined
๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ์ฝ๋์ ํจ์ฌ ๋ ๋ง์ ๋ณดํธ๊ฐ ํ์ํ ์ ์์ง๋ง ์ผ๋ถ์ ๊ฒฝ์ฐ ์ด๋ ์ ํ ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ํ์ฉ๋๋ ์ ์ถฉ์์
๋๋ค.
undefined
ํฌํจํ ์์ธ ์๋ช
์ ์:
const xs: number[] = [1,2,3];
xs[100] // number | undefined
์ด ๋์์ด strictNullChecks
์์ ์ถ๊ฐ ์ปดํ์ผ๋ฌ ์ต์
์ผ๋ก ๊ฐ์ฃผ๋ ์ ์๋์ง ์๊ณ ์ถ์ต๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ง์กฑ์ํฌ ์ ์์ต๋๋ค: ์ธ๋ฑ์ค ์๋ช
์ undefined๊ฐ ์๊ฑฐ๋ ์๋ ์๊ฒฉํ null ๊ฒ์ฌ๋ฅผ ์ํ๋ ์ฌ์ฉ์.
strictNullChecks๋ฅผ ์ ์ธํ๊ณ ์ ํ ์์คํ
๋์์ ๋ณ๊ฒฝํ๋ ํ๋๊ทธ๊ฐ ์์ต๋๋ค. ํ๋๊ทธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ๋ณด๊ณ ๋ฅผ ํ์ฑํ/๋นํ์ฑํํฉ๋๋ค.
| undefined
๋ชจ๋ ์ธ๋ฑ์๋ฅผ ์ ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ์ ์ ๋ฒ์ ์ ํญ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์์๋๋ก ์๋ํด์ผ ํฉ๋๋ค.
@mhegazy ํฅ๋ฏธ๋ก์ด ์์ด๋์ด์ ๋๋ค. ๋ฐฐ์ด/๊ฐ์ฒด์ ํ์ ์๋ช ์ ์ฌ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ด ์์ต๋๊น?
์ด interface Array<T>
์ lib.d.ts
. ๋ค๋ฅธ ์ธ๋ฑ์ฑ ์๋ช
๋ ์ฐพ๊ธฐ ์ํด ์ ๊ท ํํ์ \[\w+: (string|number)\]
์ผ๋ก ๊ฒ์ํ์ต๋๋ค.
ํฅ๋ฏธ๋กญ๊ธฐ ๋๋ฌธ์ ๋๋ ์ด๊ฒ์ ์๋ํ์ต๋๋ค.
{
// https://github.com/Microsoft/TypeScript/blob/1f92bacdc81e7ae6706ad8776121e1db986a8b27/lib/lib.d.ts#L1300
declare global {
interface Array<T> {
[n: number]: T | undefined;
}
}
const xs = [1,2,3]
const x = xs[100]
x // still number :-(
}
์ด๋ค ์์ด๋์ด?
lib.d.ts
๋ก์ปฌ๋ก ๋ณต์ฌ(์ lib.strict.d.ts
, ์์ธ ์๋ช
์ [n: number]: T | undefined;
, ์ปดํ์ผ์ ํ์ผ ํฌํจ). ์๋ํ ํจ๊ณผ๋ฅผ ๋ด์ผ ํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์ฌ๊ธฐ์ ์ ์๋ ์์ ์ฌํญ์ ๋ฌธ์ ๋ ๋ณ๋์ lib
ํ์ผ์ ๋ถ๊ธฐํ๊ณ ์ ์ง ๊ด๋ฆฌํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
์ด ๊ธฐ๋ฅ์ด ์ด๋ค ์ข ๋ฅ์ ์ต์ ์ ์ฆ์ ์ฌ์ฉํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ์๊ตฌ๋๋์ง ๊ถ๊ธํฉ๋๋ค.
์ฐธ๊ณ ๋ก ES6 ์ปฌ๋ ์
( Map
/ Set
)์ get
๋ฉ์๋์ ๋ํ ํ์ ์๋ช
์ด Array
๋ T | undefined
๋ฐํํ๋ค๋ ์ ์ ํฅ๋ฏธ๋กญ์ต๋๋ค Map
Array
/ Object
์์ธ ์๋ช
์ ๊ทธ๋ ์ง ์์ต๋๋ค.
์ด๊ฒ์ ์์์ ์ธ ๊ฒฐ์ ์ ๋๋ค. ์ด ์ฝ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋งค์ฐ ์ฑ๊ฐ์ค ๊ฒ์ ๋๋ค.
var a = [];
for (var i =0; i< a.length; i++) {
a[i]+=1; // a[i] is possibly undefined
}
๋ชจ๋ ์ฌ์ฉ์์๊ฒ !
๋ฅผ ์ฌ์ฉํ๋๋ก ์์ฒญํ๋ ๊ฒ์ ๋นํฉ๋ฆฌ์ ์
๋๋ค. ๋๋ ์ฐ๊ธฐ
var a = [];
for (var i =0; i< a.length; i++) {
if (a[i]) {
a[i]+=1; // a[i] is possibly undefined
}
}
์ง๋์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ ์ง ์์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ ํ์ ๊ฒฝ์ฐ ๋ชจ๋ ์์ธ ์๋ช
์ | undefined
๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ ์์๋๋ ๋์์ ์ป์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Array
๊ฒฝ์ฐ ํฉ๋ฆฌ์ ์ด์ง ์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํฌํ๊ณ ํ์ํ ๋ชจ๋ ๋ณ๊ฒฝ์ ์ํํ ์ ์์ง๋ง ํ์ฌ๋ก์๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ธ์ ๋ณ๊ฒฝํ ๊ณํ์ด ์์ต๋๋ค.
์ ์ธ์ ๋ชจ์์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ํ ์ผ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@mhegazy ํ์ง๋ง ๊ตฌ๋ฉ์ด ์๋ ๋ฐฐ์ด์ ๊ฒฝ์ฐ a[i]
๋ ์ค์ ๋ก ์ ์๋์ง ์์์ ์ ์์ต๋๋ค.
let a: number[] = []
a[0] = 0
a[5] =0
for (let i = 0; i < a.length; i++) {
console.log(a[i])
}
์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
undefined
undefined
undefined
undefined
0
์ฐ๋ฆฌ๋ ์ค์ ๋ก ๋๊ตฐ๊ฐ๊ฐ ์ด ํ๋๊ทธ๋ก ์ด๋ค ์ด์ ์ ์ป์ ์ ์์์ง์ ๋ํด ๋งค์ฐ ํ์์ ์
๋๋ค. ์ง๋ ๋ฐ ์ง๋์ ์ ์ฌํ ๊ฒ์ ์ด๋ฏธ ์ ์ ์ฌ์ดํธ์์ | undefined
์ ์ตํธ์ธํ ์ ์์ผ๋ฉฐ ์ด๋ ์ด ์ก์ธ์ค์์ EULA์ ์ ์ฌํ ๋์์ ์ํํ๋ ๊ฒ์ ์น๋ฆฌ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ง์๊ฒ ๋ง๋ค๊ธฐ ์ํด์๋ CFA์ ํ์
๊ฐ๋๋ฅผ ์๋นํ ๊ฐ์ ํด์ผ ํ ๊ฒ์
๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ์์ ์ lib.d.ts๋ฅผ ์์ ํ๊ณ ์์ ์ ์ฝ๋์์ ๋ชจ๋ ๋ค์ด์คํธ๋ฆผ ์ค๋จ์ ์์ ํ๊ณ ์ด๊ฒ์ด ๊ฐ์น ์ ์์ ๊ฐ์ง๊ณ ์์์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ ์ฒด diff๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ณด์ฌ์ฃผ๊ณ ์ถ๋ค๋ฉด ์ฐ๋ฆฌ๋ ํด๋น ๋ฐ์ดํฐ์ ์ด๋ ค ์์ต๋๋ค. ๋๋ ๋ง์ ์ฌ๋๋ค์ด ์ ๋ฏธ์ฌ !
๋ ์ฌ์ฉํ๊ณ ์ถ์ดํ์ง๋ง ์์ง ๊ทธ๋ด ๊ธฐํ๊ฐ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ ์ด ํ๋๊ทธ๊ฐ ์ต์
์ด ๋ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๋ ์ค์ ๋ก ๋๊ตฐ๊ฐ๊ฐ ์ด ํ๋๊ทธ๋ก ์ด๋ค ์ด์ ์ ์ป์ ์ ์์์ง์ ๋ํด ๋งค์ฐ ํ์์ ์ ๋๋ค. ์ง๋ ๋ฐ ์ง๋์ ์ ์ฌํ ์ฌ๋ฌผ์ ์ด๋ฏธ ์ ์ ์ฌ์ดํธ์์
| undefined
์ ์ตํธ์ธํ ์ ์์ต๋๋ค.
TypeScript์ ๋ชฉํ ์ค ํ๋๋ ํน์ ์์ ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ์๊ฐ ๊ธฐ์ตํ๊ฑฐ๋ ์๋๋ก ์์กดํ๊ธฐ๋ณด๋ค "์ปดํ์ผ" ์๊ฐ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ ์ ์๋๋ก ํ๋ ๊ฒ ์๋๋๊น? ์ด๊ฒ์ ๊ทธ ๋ชฉํ์ ์ด๊ธ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ถฉ๋์ ํผํ๊ธฐ ์ํด ์ฌ์ฉ์์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ์๊ตฌํฉ๋๋ค. ๋ค๋ฅธ ๋ง์ ๊ธฐ๋ฅ์ ๋ํด์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ํญ์ x๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ํ์ํ์ง ์์ต๋๋ค. TypeScript์ ๋ชฉํ๋ (์๋ง๋) ์์ ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ด๋ฌํ ๊ฒ๋ค์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค.
๊ธฐ์กด ์ฝ๋์์ strictNullChecks
๋ฅผ ํ์ฑํํ๊ณ ์ด๋ฏธ ๋น๊ต๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ทธ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ด๊ฐ ์์ ํ ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด ์๋ง ์ฌ๊ธฐ์ ๋ฌธ์ ๋ฅผ ๊นจ๋ซ์ง ๋ชปํ์ ๊ฒ์ด๊ณ (์ ํ ์์คํ
์ ํญ์ ๊ฐ์ ์ป๊ณ ์๋ค๊ณ ๋์๊ฒ ๋งํ๊ณ ์์) ๋ฐํ์ ์ค๋ฅ๋ก ๋๋ฌ์ต๋๋ค. TS ๊ฐ๋ฐ์๊ฐ | undefined
๋ชจ๋ ์ง๋๋ฅผ ์ ์ธํด์ผ ํ๋ค๋ ์ฌ์ค์ ๊ธฐ์ต(๋๋ ๋ ๋์๊ฒ๋ ์๊ณ ์์)ํ๋ ๊ฒ์ TypeScript๊ฐ ์ฌ๋๋ค์ด ์ค์ ๋ก ์ํ๋ ๊ฒ์ ์ํํ์ง ๋ชปํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
์ฐ๋ฆฌ๋ ์ค์ ๋ก ๋๊ตฐ๊ฐ๊ฐ ์ด ํ๋๊ทธ๋ก ์ด๋ค ์ด์ ์ ์ป์ ์ ์์์ง์ ๋ํด ๋งค์ฐ ํ์์ ์ ๋๋ค. ์ง๋ ๋ฐ ์ง๋์ ์ ์ฌํ ์ฌ๋ฌผ์ ์ด๋ฏธ ์ตํธ์ธ ๊ฐ๋ฅ | ์ ์ ์ฌ์ดํธ์์ ์ ์๋์ง ์์
TypeScript์ ๋ชฉํ ์ค ํ๋๋ ํน์ ์์ ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ์๊ฐ ๊ธฐ์ตํ๊ฑฐ๋ ์๋๋ก ์์กดํ๊ธฐ๋ณด๋ค "์ปดํ์ผ" ์๊ฐ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ ์ ์๋๋ก ํ๋ ๊ฒ ์๋๋๊น?
์ค์ ๋ก ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1) ์ค๋ฅ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ตฌ์ฑ์ ์ ์ ์ผ๋ก ์๋ณํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ ผ์๋๋ ๊ฒ์ ์ค๋ฅ ๊ฐ๋ฅ์ฑ(TypeScript ํ์ ์๊ฒฌ์ผ๋ก๋ ๋ฎ์)๊ณผ ์ธ์ด์ ์ผ๋ฐ์ ์ธ ์์ฐ์ ์ ์ฉ์ฑ์ ๋๋ค. CFA์ ๋ํ ์ด๊ธฐ ๋ณ๊ฒฝ ์ฌํญ ์ค ์ผ๋ถ๋ ์ด๋ฌํ ์ฌํญ์ ๋ณด๋ค ์ง๋ฅ์ ์ผ๋ก ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ ๊ฒฝ๊ณ ํ๊ฑฐ๋ CFA ๋ถ์์ ๊ฐ์ ํ๋ ๊ฒ์ด์์ต๋๋ค.
TypeScript ํ์ ์ง๋ฌธ์ ์ด๋ฌํ ์๊ฒฉํจ์ ์๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์๊ฒฉํ ์ ํ์ฑ์ ์ฃผ์ฅํ๋ ๋์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์์ ์ค์ ๋ก ๋ณดํธํด์ผ ํ๋ ์ค๋ฅ๋ฅผ ์๋ณํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด ๋๊ธ https://github.com/Microsoft/TypeScript/issues/11238#issuecomment -250562397 ์์ ์ถ๋ก ์ ์ข ๋ ๋ค์ด๊ฐ์ต๋๋ค.
์ผ๋ถ ๊ฐ์ฒด (์ํ)์ ํด๋นํ๋ ์์ฑ์ ๊ฐ์ง๊ณ ๋ชจ๋ฅด๋ ์ผ๋ถ ๊ฐ์ฒด (์์ )์ ํด๋นํ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๊น ์๊ณ ์๋ ๊ทธ, ๊ทธ : ๋ ์ธ๊ณ์์ ํค์ ์ ํ์ ์๊ฐํ์ญ์์ค.
๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฐ๋ฅธ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ฒซ ๋ฒ์งธ ์ข ๋ฅ์ ํค์ธ "์์ ํ" ํค๋ฅผ ์ป์ต๋๋ค.
for (let i = 0; i < arr.length; i++) {
// arr[i] is T, not T | undefined
๋๋
for (const k of Object.keys(obj)) {
// obj[k] is T, not T | undefined
ํค์์ ๋ ๋ฒ์งธ ์ข ๋ฅ์ธ "์ํํ" ์ข ๋ฅ๋ฅผ ์ฌ์ฉ์ ์ ๋ ฅ, ๋์คํฌ์ ์์ JSON ํ์ผ ๋๋ ์กด์ฌํ ์ ์์ง๋ง ์์ ์ ์๋ ์ผ๋ถ ํค ๋ชฉ๋ก์์ ์ป์ต๋๋ค.
๋ฐ๋ผ์ ์ํํ ์ข
๋ฅ์ ํค์ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ | undefined
์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์์ " ์ํํ ํค๋ฅผ ์ํํ ๊ฒ์ผ๋ก ์ทจ๊ธ"์ด ์๋๋ผ " ๋ชจ๋ ํค, ์ฌ์ง์ด ์์ ํ ํค๋ผ๋ ์ํํ ๊ฒ์ผ๋ก ์ทจ๊ธ"์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ๋จ ์์ ํค๋ฅผ ์ํํ ๊ฒ์ผ๋ก ์ทจ๊ธํ๊ธฐ ์์ํ๋ฉด ์ธ์์ด ์ ๋ง ์๋ง์ด ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
for (let i = 0; i < arr.length; i++) {
console.log(arr[i].name);
๊ทธ๋ฆฌ๊ณ ํ์ดํ ๋ผ์ดํฐ๊ฐ ๋น์ ๋ถํ์ด arr[i]
์ ์์ต๋๋ค undefined
์ด๋ด ๋ ๊ทธ๋ฅ @ # % # ๊ทธ๊ฒ์ ํ
์คํธ ING ๋ณด์ผ์ง๋ผ๋. ์ด์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ต๊ด์ด ์๊ฒผ์ต๋๋ค. ์ด๋ฆฌ์๊ฒ ๋๊ปด์ง๋๋ค.
for (let i = 0; i < arr.length; i++) {
// TypeScript makes me use ! with my arrays, sad.
console.log(arr[i]!.name);
๋๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค.
function doSomething(myObj: T, yourObj: T) {
for (const k of Object.keys(myObj)) {
console.log(yourObj[k].name);
}
}
TypeScript๋ "์ด๋ด, ๊ทธ ์ธ๋ฑ์ค ํํ์์ | undefined
์ผ ์ ์์ผ๋ฏ๋ก ์ด ์ค๋ฅ๋ฅผ ์ด๋ฏธ 800๋ฒ ๋ณด์๊ธฐ ๋๋ฌธ์ ์ถฉ์คํ ์์ ํด์ผ ํฉ๋๋ค.
function doSomething(myObj: T, yourObj: T) {
for (const k of Object.keys(myObj)) {
console.log(yourObj[k]!.name); // Shut up TypeScript I know what I'm doing
}
}
ํ์ง๋ง ๋ฒ๊ทธ๋ฅผ ์์ ํ์ง ์์์ต๋๋ค . Object.keys(yourObj)
, ๋๋ myObj[k]
๋ฅผ ์ฐ๋ ค๊ณ ํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ด๋ค ์๋๋ฆฌ์ค์์๋ ์ค์ ๋ก ๋์์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ต์
์ ์ปดํ์ผ๋ฌ ์ค๋ฅ์
๋๋ค. ๋์ผํ ํ์์ ๋ค๋ฅธ ํํ๋ณด๋ค ์ค์ ๋ก ๋ ์ํํ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ชจ๋ ์ข
๋ฅ์ ํํ์ ๋์ผํ ์์์ ์ ์ฉํ ๋ฟ์
๋๋ค.
"์ ๋ง ์ด ํ์ผ์ ์ญ์ ํ์๊ฒ ์ต๋๊น?" ๋ํ. ํ์ผ์ ์ญ์ ํ๋ ค๊ณ ํ ๋๋ง๋ค ํด๋น ๋ํ ์์๊ฐ ๋ํ๋๋ฉด del
๋ฅผ ๋๋ฅด๋ ๋ del y
๋ฅผ ๋๋ฅด๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๋นจ๋ฆฌ ๋ฐฐ์ฐ๊ณ ์ค์ํ ํญ๋ชฉ์ ์ญ์ ํ์ง ์์ ํ๋ฅ ์ด ์ฌ์ ์ค์ ์ผ๋ก ์ฌ์ค์ ๋ฉ๋๋ค. -๋ํ ๊ธฐ์ค์ . ํ์ผ์ด ํด์งํต์ผ๋ก ์ด๋ํ์ง ์์ ๋ ํ์ผ์ ์ญ์ ํ ๋๋ง ๋ํ ์์๊ฐ ํ์๋๋ค๋ฉด ์ด์ ์๋ฏธ ์๋ ์์ ์ ํ๋ณดํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์๋ฌด ์๊ฐ์ด ์๋ค (๋ ์ฐ๋ฆฌ ์) ๊ฐ์ฒด์ ํค๋ ๊ทธ๋ ๊ฒ ๋ณด์ฌ์ฃผ๋, ์์ ์ธ์ง ์๋์ง "๋น์ ์ ๋น์ ์ด ์ธ๋ฑ์ค์ ํด๋น ๊ฐ์ฒด๋ฅผ ์ํ๋๊ฑฐ์ผ?" ํ ๋๋ง๋ค ๋ํ ์์๊ฐ ํ์๋์ง ์๋ ๊ฒ๋ณด๋ค ๋ ๋์ ์๋๋ก ๋ฒ๊ทธ๋ฅผ ์ฐพ์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
์ค๋ฅ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ตฌ์ฑ์ ์ ์ ์ผ๋ก ์๋ณํฉ๋๋ค.
์๋ง๋ ์ด๊ฒ์ " ๋ค๋ฅธ ๊ฒ๋ณด๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ๋์ ๊ตฌ๋ฌธ์ ์ ์ ์ผ๋ก ์๋ณํฉ๋๋ค."๋ผ๊ณ ์์ ํด์ผ ํฉ๋๋ค. : ์ํฌ :. ๋ณธ์ง์ ์ผ๋ก " /
๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ *
๋ฅผ ์ฌ์ฉํ์ต๋๋ค. make *
a warning์ ์ฌ์ฉํ ์ ์์ต๋๊น?"์ ๊ฐ์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ ๋๋ฅผ ๊ธฐ์ต
์ดํดํ์ง๋ง ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์์ธ์ ์ค์ ์ ์ด๊ณ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ๋๋ค. ์ฌ๋๋ค์ด ์ด๊ฒ์ ํ ์ ์๋ ๋ฐฉ์์ผ๋ก ๋ฐฐ์ด์ ์ด๊ฑฐํ๋๋ก ๊ฐ์ํ๋ ๊ฒ์ ๋์ ์ผ์ด ์๋๋๋ค.
!
์ ๋ ์ฌ์ค ์ซ์ดํฉ๋๋ค. ๋๊ตฐ๊ฐ ์์ ๊ฐ์ ์ด ๋ฌดํจ๊ฐ ๋๋๋ก ๋ณ๊ฒฝํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์์ ์ผ๋ก ๋์๊ฐ์ต๋๋ค(์ปดํ์ผ๋ฌ๊ฐ ์ก์์ผ ํ๋ ์ ์ฌ์ ์ธ ๋ฐํ์ ์ค๋ฅ). ์ ํ์ ๋ํด ๊ฑฐ์ง๋ง์ ํ๊ฑฐ๋ !
์ฌ์ฉํ๋ ๊ฒ์ ์์กดํ์ง ์๋ ์์ ํ ๋ฐฐ์ด์ ์ด๊ฑฐํ๋ ๋ฐฉ๋ฒ์ด ์์ด์ผ ํฉ๋๋ค(์: array.forEach(i => console.log(i.name)
์ ๊ฐ์ ๊ฒ์ ํ ์ ์์ต๋๊น?).
์ด๋ฏธ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ์ ์ขํ ์ด๋ก ์์ผ๋ก๋ ์ด๋ฌํ ๊ฒฝ์ฐ์ | undefined
๋ฅผ ์ ๊ฑฐํ์ฌ ๋ ๊ฐ์ง ์ฅ์ ์ ๋ชจ๋ ์ ๊ณตํ๋ ์์ ํ ์ ํ์ ์ขํ ์ ์๋ ํจํด์ ์ฐพ์ ์ ์์์ต๋๊น? ์ ํจํ ์์์ ์ก์ธ์คํ๊ณ ์์ง ์๋ค๋ ๊ฒ์ ์ปดํ์ผ๋ฌ์ ์ฝ๊ฒ ์ ๋ฌํ ์ ์๋ค๋ฉด ๋ณด์ฆ์ด ์ ํจํ์ง ์๊ฑฐ๋ ๋์ค์ ์ค์๋ก ์ฝ๊ฒ ๊นจ์ง ์ ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
์ฆ, ๋๋ ํ๋์ ํ๋ก์ ํธ์์๋ง TS๋ฅผ ์ฌ์ฉํ๋ฉฐ ๊ถ๊ทน์ ์ผ๋ก Dart๋ก ๋ง์ด๊ทธ๋ ์ด์ ๋๋ฏ๋ก ๋์๊ฒ ์ค์ง์ ์ธ ์ฐจ์ด๋ฅผ ๋ง๋ค์ง ์์ ๊ฒ์ ๋๋ค. ์ํํธ์จ์ด์ ์ผ๋ฐ์ ์ธ ํ์ง์ด ์ข์ง ์๊ณ ํธ์์ ๋ฌด์๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ค๋ฅ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋ ๊ธฐํ๊ฐ ์๋ค๋ ๊ฒ์ด ์ํ๊น์ต๋๋ค. ์ ํ ์์คํ ์ด ๊ฒฌ๊ณ ํ๊ฒ ๋ง๋ค์ด์ง๊ณ ์ด๋ฌํ ๊ตฌ๋ฉ์ด ๋ฐ์ํ์ง ์๋ ๋ฐฉ์์ผ๋ก ์ผ๋ฐ์ ์ธ ์ฑ๊ฐ์ฌ์ด ํด๊ฒฐ๋ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
์ด์จ๋ , ๊ทธ๊ฒ์ ๋จ์ง ๋ด 2 ์ผํธ์ ๋๋ค.. ๋๋ ์ด๊ฒ์ ๋๊ณ ์ถ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋์์ ์๋์ง ์ดํดํ๊ณ ๋น์ ์ด ๋๋ณด๋ค ํจ์ฌ ๋ ๋์ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค :-)
๋ช ๊ฐ์ง ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ ์๋ฅผ ๊ณ ๋ คํ์ฌ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฐฐ์ด์ ๋ฐ๋ณตํ๊ธฐ ์ํ ๋ง์ ํจํด์ด ์์ต๋๋ค. ๋ฐฐ์ด์ ์ธ๋ฑ์ค์ ๋ฌด์์๋ก ์ก์ธ์คํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ํจํด์ด์ง๋ง ์ค์ ๋ก๋ ๋งค์ฐ ๋๋ฌธ ํจํด์ด๋ฉฐ ์ ์ ์ค๋ฅ๊ฐ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค . ๋ฐ๋ณตํ๋ ํ๋์ ์ธ ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
for (let i = 0; i < a.length; i++) {
const value = a[i];
}
์ฌ๋ถ์ ์ด๋ ์ด๊ฐ ํํ์ง ์๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด(๊ทธ๋ค์) value
๊ฐ | undefined
๊ฐ ๋๋๋ก ํ๋ ๊ฒ์ ๊ฑฐ์ ๋์์ด ๋์ง ์์ต๋๋ค. ์ผ์์์ ์ด๊ฒ์ด ์ํํ(๊ทธ๋ฆฌ๊ณ ์ค๋ฅ์ผ ๊ฐ๋ฅ์ฑ์ด ์๋) ์ผ๋ฐ์ ์ธ ํจํด์ด ์๋ ๊ฒฝ์ฐ TypeScript๊ฐ ์ด๋ฅผ ๊ณ ๋ คํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํจํด์ ์ ์๋์ง ์์ ์ธ๋ฑ์ค ์ก์ธ์ค๋ ๋ถ๋ช
ํ ์์ฐ์ฑ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ผ๋ก ์ง์ ๋ ๋๋ก ์ ์ฌ์ ์ผ๋ก ์ ์ฉํ ์ํฉ์ ์๋ ๊ฒฝ์ฐ ์ ํํ ์ ์์ต๋๋ค.
์ด์ ์ CFA๋ฅผ ๊ฐ์ ํ์ฌ ๊ฐ์ ์ํธ ์์กด์ฑ์ ํํํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค(์: Array.prototype.length๋ ์ธ๋ฑ์ค ๊ฐ๊ณผ ๊ด๋ จ๋จ). ๊ทธ๋์ index out of bounds์ ๊ฐ์ ๊ฒ๋ค์ด ์ ์ ์ผ๋ก ๋ถ์๋ ์ ์์ต๋๋ค. ๋ถ๋ช ํ ๊ทธ๊ฒ์ ๋ด๊ฐ ์ดํดํ๊ณ ์ถ์ง ์์ ๋ชจ๋ ์ข ๋ฅ์ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์ ๊ณ ๋ ค ์ฌํญ์ผ๋ก ์ด๋ฃจ์ด์ง ์ค์ํ ์์ ์ ๋๋ค(Anders๊ฐ ์ด์ ๊ฐ์ ์ผ์ ์์๋์ ํ๋ฆฌ๋ฉฐ ๊นจ์ด๋ ๊ฐ๋ฅ์ฑ์ด ๋์ง๋ง).
๋ฐ๋ผ์ ํธ๋ ์ด๋ ์คํ๊ฐ ๋ฉ๋๋ค... CFA ๊ฐ์ ์์ด ์ฝ๋์ 90%๋ฅผ ์ฒญ์ด ๋ก ๋ณต์กํ๊ฒ ๋ง๋ค์ด ์ ์ฌ์ ์ผ๋ก 10%์ ๋ถ๋ ์ฝ๋ ๋ฅผ ์ก์๋ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ ์ฑ์ ๋ํ ์์ฒด ๊ฒฐ๊ณผ์ ๋ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฃผ์ CFA ๊ฐ์ ์ ํฌ์ํ์ฌ ์์ ํ์ง ์์ ์ฝ๋๋ฅผ ์ฐพ๋ ๊ฒ์ ๋๋ค.
TypeScript๊ฐ ์ฐ๋ฆฌ๋ฅผ ์ฐ๋ฆฌ ์์ ์ผ๋ก๋ถํฐ ๊ตฌํ ์ ์๋ ๊ฒ์ ์์ฃผ ๋ง์ต๋๋ค.
์ด ๋ชจ๋ ์ด์ ์ ๋ฐฐ์ด์ ์์ผ๋ฉฐ ๊ฑฐ๊ธฐ์์ ๋ฌธ์ ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์ ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ธฐ๋ ์๋ ๋ฌธ์ ์ ๋๋ถ๋ถ์(๋ด ๊ฒ๊ณผ ๊ฐ์) ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๊ฐ ํญ์ ์กด์ฌํ๋ ํค๋ผ๊ณ ์๊ฐํ์ง ์๋ ๋งต์ ๊ดํ ๊ฒ์ด์์ต๋๋ค.
์ด ๋ชจ๋ ์ด์ ์ ๋ฐฐ์ด์ ์์ผ๋ฉฐ ๊ฑฐ๊ธฐ์์ ๋ฌธ์ ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์ ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ธฐ๋ ์๋ ๋ฌธ์ ์ ๋๋ถ๋ถ์(๋ด ๊ฒ๊ณผ ๊ฐ์) ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๊ฐ ํญ์ ์กด์ฌํ๋ ํค๋ผ๊ณ ์๊ฐํ์ง ์๋ ๋งต์ ๊ดํ ๊ฒ์ด์์ต๋๋ค.
์ด๊ฒ์ด ๊ทํ์ ์ ํ์ธ ๊ฒฝ์ฐ ์์ธ ์๋ช
์ | undefined
๋ฅผ ์ถ๊ฐํ์ญ์์ค. --noImplicitAny
์๋์ ์์ธ ์๋ช
์ด ์๋ ์ ํ์ผ๋ก ์์ธ์ ์์ฑํ๋ ๊ฒ์ ์ด๋ฏธ ์ค๋ฅ์
๋๋ค.
ES6 Map
๋ ์ด๋ฏธ get(key: K): V | undefined;
๋ก get์ผ๋ก ์ ์๋์ด ์์ต๋๋ค.
๋๋ | undefined
๋ฐํํ๋ ์ธ๋ฑ์ค ์๋ช
์ ๋ง๋ค๊ธฐ ์ํด ๋ฐฐ์ด ๋ฐ ์ง๋์ ๋ชจ๋ ์ ์๋ฅผ ๋ค์ ์์ฑ !
TypeScript๊ฐ C#์ฒ๋ผ ๊ฒ์ฌ ํ๋ฆ์ ์ ์ดํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค(์ธ๋ฑ์ค ๋ฒ์ ๊ฒ์ฌ๋ฅผ ์ ๊ฑฐํ์ฌ ํ๋ก์ธ์ ์๊ฐ์ ์ ์ฝํ๊ธฐ ์ํด). ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
declare var values: number[];
for (let index = 0, length = values.length; index< length; index ++) {
const value = value[index]; // always defined, because index is within array range and only controlled by it
}
(ํฌ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์๊ฒ - ๋จ๊ฑฐ์ด ๋ถํ๋ ๋ถ๋ก ์์ด)
Object.keys
๊ฒฝ์ฐ ์ ์ด ํ๋ฆ ๋ถ์์ด ์์ ํ ์ถ์๋ฅผ ์ํํ๋๋ก ํ๋ ค๋ฉด allkeysof T
์ ๊ฐ์ ํน์ ์ ํ์ด ํ์ํฉ๋๋ค.
์ง๊ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ฑ์ฑ ์์
์ ์ ํ์ ๋ํด ๊ฑฐ์ง๋ง์ ํ๊ณ ์๊ณ ๋ด ๊ฐ์ฒด ์ ํ์ | undefined
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฌ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ข์ ์ต์
์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. undefined
๋ฅผ ๋ฌด์ํ๊ณ ์ถ์ ๊ฒฝ์ฐ !
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ด ์ต์
์ด ํ์ฑํ๋์์ ๋ ์ธ๋ฑ์ฑ ์์
์ ์ฒ๋ฆฌํ๋ ์ข์ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฒด ์ ํ ์ ์์ |undefined
๋ฅผ ๋ฃ๋ ๋ฐ๋ (์ ์ด๋) ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Object.values
(๋๋ _.values
)์ ๊ฐ์ ๋ค๋ฅธ ์์
์ ๊ฒฐ๊ณผ์์ undefined
๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.tslint๋ typescript๊ฐ ์๋ชป๋ ์ ํ ์ ๋ณด๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์(= | undefined
๋ถ์กฑ) ์์ ์กฐ๊ฑด์ ๋ํ ๊ฐ์์ฑ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
https://github.com/palantir/tslint/issues/2944
๋ฐฐ์ด ์ธ๋ฑ์ฑ์ | undefined
๊ฐ ์๋ ๊ฒฝ์ฐ ์ ๊ธฐ์ ์ผ๋ก ๊ฑด๋๋ฐ๋ ์ค๋ฅ ์ค ํ๋๋ find
๋์ ์ฌ์ฉํ ๋ ์ด ํจํด์
๋๋ค.
const array = [ 1, 2, 3 ];
const firstFour = array.filter((x) => (x === 4))[0];
// if there is no `4` in the `array`,
// `firstFour` will be `undefined`, but TypeScript thinks `number` because of the indexer signature.
const array = [ 1, 2, 3 ];
const firstFour = array.find((x) => (x === 4));
// `firstFour` will be correctly typed as `number | undefined` because of the `find` signature.
๋๋ ํ์คํ ์ด ๊น๋ฐ์ ์ฌ์ฉํ ๊ฒ์ด๋ค. ์, ์ค๋๋ for
๋ฃจํ๋ ์์
ํ๊ธฐ ๊ท์ฐฎ์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ ์๋ ๊ฒ์ ์๋ฉด ์ปดํ์ผ๋ฌ์๊ฒ ์๋ ค์ฃผ๋ !
์ฐ์ฐ์๊ฐ ์์ต๋๋ค.
for (let i = 0; i < arr.length; i++) {
foo(arr[i]!)
}
๋ํ ์ด ๋ฌธ์ ๋ ๋ ์๋กญ๊ณ ๋ ๋์ for of
๋ฃจํ์๋ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ์ด์ ์คํ์ผ์ for
๋ฃจํ๋ฅผ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ์๋ ค์ฃผ๋ TSLint ๊ท์น prefer-for-of
for
์์ต๋๋ค. ๋ ์ด์.
ํ์ฌ ๊ฐ๋ฐ์์๊ฒ ์ ํ ์์คํ
์ด ์ผ๊ด์ฑ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. array.pop()
์๋ if
ํ์ธ ๋๋ !
์ด์ค์
์ด ํ์ํ์ง๋ง [array.length - 1]
๋ฅผ ํตํ ์ก์ธ์ค๋ ํ์ํ์ง ์์ต๋๋ค. ES6 map.get()
์๋ if
๊ฒ์ฌ ๋๋ !
์ฃผ์ฅ์ด ํ์ํ์ง๋ง ๊ฐ์ฒด ํด์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. @sompylasar ์ ์๋ ์ข์ต๋๋ค.
๋ ๋ค๋ฅธ ์๋ ๊ตฌ์กฐํ์ ๋๋ค.
const specifier = 'Microsoft/TypeScript'
const [repo, revision] = specifier.split('@') // types of repo and revision are string
console.log('Repo: ' + repo)
console.log('Short rev: ' + revision.slice(0, 7)) // Error: Cannot call function 'slice' on undefined
์ปดํ์ผ๋ฌ๊ฐ ๊ฐ์ ๋ก ์ด๋ ๊ฒ ํ๋ค๋ฉด ๋ ์ข์์ ๊ฒ์ ๋๋ค.
const specifier = 'Microsoft/TypeScript'
const [repo, revision] = specifier.split('@') // types of repo and revision are string | undefined
console.log('Repo: ', repo || 'no repo')
console.log('Short rev:', revision ? revision.slice(0, 7) : 'no revision')
์ด๊ฒ๋ค์ ์ปดํ์ผ๋ฌ์ ์ํด ๋ฐฉ์ง๋ ์ ์์๋ ์ค์ ๋ฒ๊ทธ์ ๋๋ค.
Imo ์ด๊ฒ์ ํ์ดํ ํ์ผ์ ์ํด์๋ ์ ๋์ง๋ง ์คํ๋ ค ์ ํ ์์คํ
๋ฉ์นด๋์ด์ด์ผ ํฉ๋๋ค. ์ธ๋ฑ์ค ์๋ช
์ด ์๋ ํญ๋ชฉ์ ์ก์ธ์คํ ๋ undefined
๊ฐ ๋ ์ ์์ต๋๋ค. ๋
ผ๋ฆฌ์์ ๊ทธ๋ ์ง ์์ ๊ฒ์ผ๋ก ํ์ธ๋๋ฉด !
. ๊ทธ๋ ์ง ์์ผ๋ฉด if
์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
๋๋ ๋ง์ ์ฌ๋๋ค์ด ์กํ์ง ์์ ๋ฒ๊ทธ๋ก ๋์จํ ๊ฒ๋ณด๋ค ๋ช ๊ฐ์ง ํ์ํ ์ฃผ์ฅ์ ๋ํด ์๊ฒฉํ ์ปดํ์ผ๋ฌ๋ฅผ ์ ํธํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ ํ์ฌ์ ์ฝ๋ ๊ธฐ๋ฐ์์ ๋ฐฐ์ด ๋๋ค ์ก์ธ์ค๋ ๋๋ฌธ ์์ธ์ด๋ฉฐ for
๋ฃจํ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณ ์ฐจ ํจ์๋ก ๋ค์ ์์ฑํ๋ ค๋ ์ฝ๋ ๋์์
๋๋ค.
@pelotom ๊ทธ๋ฌ๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์์ต๋๊น?
@aleksey-bykov๋ ์ฃผ๋ก ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ด๋ฒ์ํ๊ฒ ๋ฐ์ํ๋ ๊ฐ์ฒด ์ธ๋ฑ์ค ์๋ช
์
๋๋ค. ๊ฒฐ๊ณผ๊ฐ ์ ์๋์ง ์์์ ์ ์์์ ๊ฒฝ๊ณ ํ๊ธฐ ์ํด { [k: string]: A }
์ ์์ฑ์ ์ก์ธ์คํ๊ณ ์ถ์ต๋๋ค. ํ๋๊ทธ๊ฐ ์์
ํ๊ธฐ์ ๋๋ฌด ์ฑ๊ฐ์ ์ด์ ์ ๋ํ ์ฌ๋ก๋ก ์ ๊ธฐ๋์๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด ์ธ๋ฑ์ฑ์ ๋ํด์๋ง ์ธ๊ธํ์ต๋๋ค.
์ํ๋ ๋ฐฉ์์ผ๋ก ์ ํํ๊ฒ ๋ค์ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ๊ณ์ญ๋๊น? (์ฝ๊ฐ์ ์ถ๊ฐ ์์ ์ด ์ฃผ์ด์ง)
์, ๋ชจ๋ ์ฌ๋์ ํ์ดํ์ ๋ค์ ์์ฑํ๊ฑฐ๋ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ฅผ ์ผค ์ ์์ต๋๋ค ๐
๊ณ์ํด์ Captain O๋ฅผ ํ๋ ์ดํ์ธ์...: ์ค๋ lib.d.ts
๋ค์ ์์ฑํ๊ณ ๋ ๋ง์ ์ฌ์ด๋ ์ฝ๋๋ฒ ์ด์ค์ ํ๋ณตํ ์์ ์๊ฐ ๋๊ฑฐ๋ ๋ค์ N๋
๋์ ํ๋๊ทธ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค.
@aleksey-bykov lib.d.ts
๋ฅผ ๋ค์ ์์ฑํ์ฌ ์ด๋ป๊ฒ ํ ์ ์์ต๋๊น?
declare type Keyed<T> = { [key: string]: T | undefined; }
๊ทธ๋ฐ ๋ค์ lib.es2015.core.d.ts
์ Array
์ ์์์ ๋ค์์ ๋ฐ๊ฟ๋๋ค.
[n: number]: T;
~์ ํจ๊ป
[n: number]: T | undefined;
@aleksey-bykov ์๋ง๋ ๋ด๊ฐ ๋ฐฐ์ด์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๊ณ ๋งํ ๋ถ๋ถ์ ๋์ณค์ ๊ฒ์
๋๋ค. ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ { [k: string]: T }
์ ํ์ผ๋ก ์ ์ธํ ์์น์ ๊ด์ฌ์ด ์์ผ๋ฉฐ ์ด๋ฌํ ๊ฐ์ฒด์ ์ก์ธ์คํ์ฌ ์ ์๋์ง ์์ ๊ฒ์ ๋ฐํํ๊ณ ์ถ์ต๋๋ค. lib.d.ts
๋ฅผ ์์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ด๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ๋ฌธ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ช
์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
ํ์ฌ ์ ์ ํ์ผ์ ์ ์ดํ ์ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ๋น์ ์ ๊ทธ๋ค์ ๊ณ ์น ์ ์์ต๋๋ค
๊ทธ๋ฆฌ๊ณ ์ด์ ์ฐ๋ฆฌ๋ ๋ค์
์, ๋ชจ๋ ์ฌ๋์ ํ์ดํ์ ๋ค์ ์์ฑํ๊ฑฐ๋ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ฅผ ์ผค ์ ์์ต๋๋ค ๐
์๊ฐ์ ํํํ ์์ ๋๋ค.
๋ฐ๋ณด์ง ํ์ง๋ง, "๋ชจ๋์ ํ์ดํ"์ ์ฌ์ฉํ์ง ์๋? ๋ง ๊ทธ๋๋ก ์ ํ์ ์ธ ํ๋ก์ ํธ์ ์ต๋ ์์ ์ผ์ ๋๋ค.
์, ํญ์ ๋ค๋ฅธ ์ฌ๋์ ํ์ดํ์ ํธ์งํด์ผ ํ๋ฉฐ ๋ ํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ ์ N ๋ ์์, ์๋ง๋, ์ง๊ธ ๋น์ ์ ๊ณ ํต์ ๊ฒช๊ฑฐ๋ ์ฌ๋์ด ๋ ์ ์์ต๋๋ค
๋ฏฟ์ ์ ์์ ์ ๋๋ก ๊ฑด์ค์ ์ธ ์๊ฒฌ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
์ด์ ๋ํ ๊ฑด์ค์ ์ธ ์
๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ข
๋ฃ๋์ด์ผ ํฉ๋๋ค.
NS. [x]
๊ฐ undefined
๊ฐ ๋ ์ ์๋์ง ์ฌ๋ถ์ ๋ํ ๊ฒฐ์ ์ ๊ฐ๋ฐ์์๊ฒ ๋งก๊ฒจ์ง๋๋ค.
lib.d.ts
๋ฐ 3rd-party.d.ts
NS. ๋๋ #a์์ ์์ผ๋ก ์ฝ๊ฒ ์ํํ ์ ์๋ ๊ฒ์ ์ํํ๋ ๋ฐ ํน์ ๊ตฌ๋ฌธ/์ ํ/ํ๋ฆ ๋ถ์/N๋ ์ด ๊ฑธ๋ฆฝ๋๋ค.
๋ฌธ์ ๋ ์๋ก์ด ๊ตฌ๋ฌธ์ด ์ ์๋์ง ์๋๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ (b)์ ๋ํ ์ ์์ด๋ฉฐ, ์ด๋ ๋จ์ง ์ปดํ์ผ๋ฌ ํ๋๊ทธ์ ๋๋ค.
๊ฒฐ๋ก ์ { [x: string]: {} }
์ ํ์ ๊ฑฐ์ ํญ์ ๊ฑฐ์ง๋ง์ด๋ผ๋ ๊ฒ์
๋๋ค. Proxy
์ ์ฌ์ฉ์ ์ ์ธํ๊ณ ๋ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฌธ์์ด๋ณด๋ค ํจ์ฌ ์ ์ ์์ ์์ฑ์ ๊ฐ์ง ์ ์๋ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค. ์ ์์ ์ด๊ฒ์ ์ธ์ํ๋ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ฅผ ๊ฐ๋ ๊ฒ์
๋๋ค. ์ป์ ๊ฒ์ ์ํด ์ด๊ฒ์ ๊ตฌํํ๋ ๊ฒ์ด ๋๋ฌด ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ทธ ๋ถ๋ฆ์ ๊ตฌํ์๋ค์๊ฒ ๋งก๊ธฐ๊ฒ ์ต๋๋ค.
์์ ์ ๋ ๋ค
T | undefined
T
๋ ์๋๋๋ค.์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ์ณ๋ค
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ ์ ํฉํ๋๋ก ํ๋ ค๋ฉด ๊ฐ์ ์กด์ฌ์ ๋ํ ์ ๋ณด๋ฅผ ์ข ์ ์ ํ ์์คํ ์ ํธ์ถ ํ๋ ์ปจํ ์ด๋ ์ ํ ์ผ๋ก ์ธ์ฝ๋ฉํด์ผ ํฉ๋๋ค . ์ด๋ ๊ทธ ์์ฒด๋ก ๋์ ๊ฒ์ด ์๋๋๋ค. :) ํ์ง๋ง ... ์ผ๋ถ ํธ์ง์ ์ ์ฅํ๊ธฐ ์ํด ์ค๋๋ ๊น์ง ์ํ๋๋ ๋ชจ๋ ํ์ฌ ์ ํ ์คํฌ๋ฆฝํธ ์ ํ ์์คํ ๋งํผ ๋ณต์กํ ์ ์์ต๋๋ค.
T | undefined
๋ ๋ด๊ฐ ๋ฐฉ๊ธ ๋งํ ์ด์ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๋ง์ต๋๋ค. ์ข
์ ์ ํ์ ๋ํ ๋ฌด์๋ฏธํ ๋ง์ ๋ฌด์ํ๊ฒ ์ต๋๋ค. ์ข์ ํ๋ฃจ ๋์ธ์.
๋น์ ์ ๋น์ ์ด ์ํ๋๋งํผ ๋๋ฅผ ๋ฌด์ํ ์ ์์ง๋ง T | undefined
๋
declare var items: number[];
for (var index = 0; index < items.length; index ++) {
void items[index];
}
๊ธฐ๋ณธ์ ์ผ๋ก T | undefined
๊ฐ ์๊ณ ์ปดํ์ผ๋ฌ์ index
๊ฐ items
์ ์ซ์ ์ธ๋ฑ์ค ๋ฒ์์ด๋ฏ๋ก items
; ์์ฃผ ์ฌ์ฉ๋๋ for
/ while
๋ฃจํ ๋ชจ์๊ณผ ๊ฐ์ ๊ฐ๋จํ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ์์ ์๋์ผ๋ก ์ถ๋ก ํ ์ ์์ต๋๋ค. ๋ณต์กํ ๊ฒฝ์ฐ ์ฃ์กํฉ๋๋ค. undefined
๊ฐ ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์, ๊ฐ์น ๊ธฐ๋ฐ ์ ํ์ด ์ฌ๊ธฐ์ ์ ํฉํฉ๋๋ค. ๋ฆฌํฐ๋ด ๋ฌธ์์ด ์ ํ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ๋ฆฌํฐ๋ด ๋ถ์ธ ๋ฐ ์ซ์ ๋ฐ ๋ฒ์/๋ฒ์ ์งํฉ ์ ํ์ด ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? TypeScript๋ JavaScript๋ก ํํํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ๋ค๋ฃจ๋ ค๊ณ ํฉ๋๋ค(์๋ฅผ ๋ค์ด Elm์ด ์ด๋ฅผ ์ ํํ๋ ๊ฒ๊ณผ ๋์กฐ์ ์ผ๋ก).
๋ง ๊ทธ๋๋ก ์ ํ์ ์ธ ํ๋ก์ ํธ์ ์ต๋ ์์ ์ผ์ ๋๋ค.
@aleksey-bykov, ๋ณ๊ฒฝ ํ ์ด๋ค ๊ฒฝํ์ด ์์๋์ง ๊ถ๊ธํ์ญ๋๊น? !
๋ฅผ ์ผ๋ง๋ ์์ฃผ ์ฌ์ฉํด์ผ ํฉ๋๊น? ์ค์ ๋ฒ๊ทธ์ ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ ์ปดํ์ผ๋ฌ๋ฅผ ์ผ๋ง๋ ์์ฃผ ์ฐพ์ ์ ์์ต๋๊น?
@mhegazy ์์งํ T
์์ T | undefined
์ด๋ํ๋ ๋ฐ ํฐ ์ฐจ์ด๋ฅผ ๋๋ผ์ง ๋ชปํ์ต๋๋ค. ๋ฒ๊ทธ๋ ์ก์ง ๋ชปํ์ต๋๋ค. ์ ๋ฌธ์ ๋ !
๋ฅผ ์ ์งํ๋ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ํตํด ์ด๋ ์ด๋ก ์์
ํ๋ค๋ ๊ฒ์
๋๋ค
์ด๋ค lib
ํ์ผ์์ ๊ฐ์ฒด์ ๋ํ ์ธ๋ฑ์ค ์ ํ ์ ์๋ฅผ ์ฐพ์ ์ ์์ต๋๊น? ๋๋ ์์น ๋ฐ ์
๋ฐ์ดํธ ํ Array
์์ [n: number]: T
์ [n: number]: T | undefined
. ์ด์ ๊ฐ์ฒด์ ๋ํด์๋ ๋์ผํ ์์
์ ์ํํ๊ณ ์ถ์ต๋๋ค.
์ธ๋ฑ์ค ์๋ช
์ด ์๋ ๊ฐ์ฒด์ ๋ํ ํ์ค ์ธํฐํ์ด์ค(์ Array
๋ฐฐ์ด์ ๊ฒฝ์ฐ
์ฝ๋์์ ๊ฐ ์ฌ๋ก๋ณ๋ก ์ ํํ ์ ์๋ฅผ ์ฐพ์ ์์ ํด์ผ ํฉ๋๋ค.
์ง์ ํค ์กฐํ๋ ์ด๋ป์ต๋๊น? ์
const xs = { foo: 'bar' }
xs['foo']
์ํ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์๋์ T | undefined
๋์ T
์ฌ๊ธฐ? ํ์ฌ ์ ๋ ๋ฐฐ์ด ๋ฐ ๊ฐ์ฒด์ ๋ํ ์์ธ ์กฐํ์ ๋ํ ์ ํ ์์ ํ ๋์์ผ๋ก ๋ด ์ฝ๋๋ฒ ์ด์ค์์ ์ด๋ฌํ ๋์ฐ๋ฏธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
// TS doesn't return the correct type for array and object index signatures. It returns `T` instead
// of `T | undefined`. These helpers give us the correct type.
// https://github.com/Microsoft/TypeScript/issues/13778
export const getIndex = function<X> (index: number, xs: X[]): X | undefined {
return xs[index];
};
export const getKeyInMap = function<X> (key: string, xs: { [key: string]: X }): X | undefined {
return xs[key];
};
@mhegazy ์ด ๊ธ์ ์์ฑํ๋ฉด์ https://unsplash.com ์์ ๋ ์๊ฒฉํ ์ธ๋ฑ์ค ์๋ช ์ ํ์ผ๋ก ์ก์ ์ ์์๋ ํ๋ก๋์ ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ณ ์์ต๋๋ค.
๋๋ ๋งคํ ๋ ์ ํ ์ฐ์ฐ์๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
const xs = { foo: 'bar' };
type EachUndefined<T> = { [P in keyof T]: T[P] | undefined; }
const xu : EachUndefined<typeof xs> = xs;
xu.foo; // <-- string | undefined
ํ๋๊ทธ๊ฐ lib.d.ts
ํ์ผ์ ๋ณ๊ฒฝํ๋๋ก ์ค๊ณ๋์ง ์์๊ธฐ ๋๋ฌธ์ --strictArrayIndex
์ ๊ฐ์ ํ๋๊ทธ๋ ์ต์
์ด ์๋๋๋ค. " lib": ['strict-es6']
? ๊ฐ์ lib.d.ts
ํ์ผ์ ์๊ฒฉํ ๋ฒ์ ์ ๋ฆด๋ฆฌ์คํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์๋ ์๊ฒฉํ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ๊ฐ์ ์ฌํญ์ด ํฌํจ๋ ์ ์์ต๋๋ค. ์: Object.keys
:
interface ObjectConstructor {
// ...
keys(o: {}): string[];
}
๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
interface ObjectConstructor {
// ...
keys<T>(o: T): (keyof T)[];
}
์ค๋ SBS์์ ์ ๋ฐ์ดํธ: 30๋ถ ๋์ ์๋ก ์๋ฆฌ ์ง๋ฅด๋ฉฐ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์์ต๋๋ค. ๐คทโโ๏ธ
@RyanCavanaugh ๊ถ๊ธ ํด์ SBS๋?
@radix "์ ์ ๋ฐฑ๋ก๊ทธ
์๋ฃจ์
์ด ๋ถ๋ช
ํ๊ธฐ ๋๋ฌธ์ ํฅ๋ฏธ๋กญ์ต๋๋ค.
T
๋ฐ T | undefined
๋ชจ๋ ์๋ชป๋์์ต๋๋ค. ์ ์ผํ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ์งํฉ์์ ์ ํํ๊ฑฐ๋ ์๋ ค์ง ์ซ์ ๋ฒ์๋ก ๋ฌถ์์ผ๋ก์จ ์ธ๋ฑ์ค ๋ณ์๊ฐ ์ปจํ
์ด๋์ ์ฉ๋์ ์ธ์ํ๋๋ก ํ๋ ๊ฒ์
๋๋ค.
@RyanCavanaugh ๋๋ ์ด๊ฒ์ ๋ํด ์๊ฐํ๊ณ ์์ต๋๋ค. ๋ค์ ํธ๋ฆญ์ด ๋ชจ๋ ๊ฒฝ์ฐ์ 87%๋ฅผ ์ปค๋ฒํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
values[index]
๋ T
์ธ๋ฑ์ค๊ฐ ์ ์ธ๋ ๊ฒฝ์ฐ for (HERE; ...)
values[somethingElse]
์ ๊ณต T | undefined
๋ชจ๋ ๋ณ์์ ๋ํ ์ธ๋ถ์ ์ ์ธ for
@ ์๋ ์ธ์ด-์ฝํ ์ฐ๋ฆฌ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋
ผ์์๋ ์ค๋งํธ -์ด '์ ๋ํ ์ค์ ์ ํํ ๊ฐ๋ ๋ฉ์ปค๋์ฆ์ด ๋ ์ ์๋ค๊ณ arr[index]
ํ
์คํธ ํ index < arr.length
.ํ์ง๋ง์ด ๊ฒฝ์ฐ ๋์์ด๋์ง ๊ฒ์
๋๋ค ์ด๋ pop
๋ฃจํ ์ค๊ฐ์
Aleksey๊ฐ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
๋๋ ์ต๊ทผ์ Elm์์ Typescript๋ก ์ฑ์ ์ด์ํ๊ณ ์ธ๋ฑ์ฑ ์์
์ด ์๋ชป ์
๋ ฅ๋ ๊ฒ์ ์๋ง๋ ๊ฐ์ฅ ์๊ฒฉํ TS ์ค์ ์ด ํ์ฑํ๋( this
๊ณผ ๊ฐ์ ํญ๋ชฉ๋ ์ธ๋ฐ์ด๋๋) ๋ด๊ฐ ๊ฒช์ ๊ฐ์ฅ ํฐ ๋ฒ๊ทธ ์์ค ์ค ํ๋์ผ ๊ฒ์
๋๋ค. ).
์ด๊ฒ์ผ๋ก ๊ฑฐ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๊ฐ < array.length
๋ด์ ๋ชจ๋ ์์์ ๋ํ ๋ฉ์ฒญํ ๋ฐ๋ณต์ธ ๊ฒฝ์ฐ ์ ์๋ํ๊ฒ ์ต๋๊น?
๋ด๊ฐ ํ์์ ๋งํ๋ฏ์ด
for
๋ฌธ์ ์ ์ด๋๊ฐ์์ ์์๋์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค: ์ด๊ธฐํ, ์ฆ๊ฐ, ์ค์ง ์กฐ๊ฑด ๋ฐ ๋ฐ๋ผ์ ํ๋ง ์ ์ฒด ์ ํ ๊ฒ์ฌ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ํ์ธํ ์ ์๋ ํญ๋ชฉ์ด ์๋๋๋ค.for
์ ์ธ๋ถ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ๊ฐ ์์ ์ ์์ต๋๋ค.์ธ๋ฑ์ค๊ฐ ์ด๋ป๊ฒ๋ ์ ์ธ๋๋ ํ(์์ ์๊ฒ ๋งํ ์ ์๋ ๊ฒ์ด ์์) ๋ฃจํ ๋ณธ๋ฌธ ๋ด์์ ์ธ๋ฑ์ค๊ฐ ์ ํํ๋ค๊ณ ๋ฏฟ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ๋ก ๊ณต์ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ฃจํ ์ค๊ฐ์ ํ๋๊ฑฐ๋ ๋ฐฐ์ด์์ ์์๋ฅผ ์ ๊ฑฐํ ํจ์์ ๋ฐฐ์ด์ ์ ๋ฌํ ๊ฒฝ์ฐ์๋ ๋์์ด ๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ์ด๊ฒ์ ๋ํ ์ ๋ง ์ฝํ ์ฃผ์ฅ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ด๋ฌํ ์ฌ๋ก๋ ์ด๋ฏธ ํ์๋์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋ก๋ฅผ ์์ ํ์ง ์๊ธฐ ์ํ ํ๊ณ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ ์๋ ๋๊ตฌ๋ ์ด๋ฌํ ์ฌ๋ก๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๊ฑฐ๋ 100% ์ ํํ๊ธฐ๋ฅผ ์๊ตฌํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ ๋ง ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ์ ํํ ์ ํ์ ์ํ ๋ฟ์ ๋๋ค. TypeScript์๋ ์๋ฒฝํ๊ฒ ์ฒ๋ฆฌ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ด ์์ต๋๋ค. ์ด์ํ ์ผ์ ํ๊ณ ์๋ค๋ฉด ์ ํ์ด ํ๋ฆด ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ์ด์ํ ์ผ์ ํ์ง ์์ผ๋ฉฐ ์ ํ์ด ์๋ชป๋์์ต๋๋ค.
์ฝ๋๋ฅผ ์์ ํ๊ธฐ ์ํด ์์ ์ถ๊ฐํ๊ธฐ
์ด๊ฒ์ด "์ฝ๋ ์์ ์ ์ํ ์์ ์ถ๊ฐ"์ธ ์ฝ๋ ์์ ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค. ๋ด๊ฐ ์ดํดํ๋ ๊ฒ์ฒ๋ผ ๋ฐฐ์ด์ ๋ํ ๊ธฐ๋ณธ for ๋ฃจํ๋ ๊ฐ์ง/์ ํํ๊ธฐ ์ฝ์ต๋๋ค. ์ ์ฌ์ ์ผ๋ก ๋ฒ๊ทธ๊ฐ ์๋ ๋ถํธํ๊ฒ ๋๋ ๋จ์ for ๋ฃจํ๊ฐ ์๋ ์ค์ ์ฝ๋
๋ฒ๊ทธ๋ฅผ ์ก์ง ์์ผ๋ฉด์
์ด๋ก ์ธํด ์ปดํ์ผ์ ์คํจํ ์์ ์ฝ๋์ ์ ํ์ด ๊ฐ๋ฐ์๋ฅผ ์ค๋ํ๊ธฐ ๋๋ฌธ์ ๋ฐํ์์ throw๋๋ ์ฝ๋์ ์๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ๋ท๋ฐ์นจํ๋ ๊ฐ์น๊ฐ 0์ด๋ผ๋ ๊ฒ์ ๋์ผ์ค์ ๋๋ค.
์ ์ฐ๋ฆฌ๋ ๋จ์ํ๊ฒ ์ ์งํ๊ณ ๊ตฌ์ for ๋ฃจํ ์ฃผ์์ _any_ ๋ง๋ฒ ๋์์ ์ถ๊ฐํ์ง ์์ ์ ์์ต๋๊น? ํญ์ !
๋ฅผ ์ฌ์ฉํ์ฌ ์์
์ ์ํํ ์ ์์ต๋๋ค. ์ฝ๋๋ฒ ์ด์ค๊ฐ ๊ตฌ์ for
๋ฃจํ๋ก ๊ฐ๋ ์ฐจ ์์ผ๋ฉด ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ๋ด๊ฐ ์์
ํ ๋ชจ๋ ์ต์ ์ฝ๋๋ฒ ์ด์ค๋ forEach
๋๋ for of
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๋ฐ๋ณตํ๋ฉฐ ์ด๋ฌํ ์ฝ๋๋ฒ ์ด์ค๋ ์ถ๊ฐ ์ ํ ์์ ์ฑ์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด์ํ ์ง์ ํ์ง ์๊ณ ์ ํ์ด ์๋ชป๋์์ต๋๋ค.
๋์๊ฒ ์ด ๋จ๋ฝ์ ์ด ๊ธฐ๋ฅ์ด ์๋ ์ข์ ์ด์ ์ฒ๋ผ ์ฝํ๋๋ค. ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ฐฐ์ด์ ์ก์ธ์คํ๋ ๊ฒ์ ์ด์ํ ์ผ์
๋๋ค. ์ผ๋ฐ์ ์ด์ง ์์ ์ผ(OOBing)์ ์ํํ๋ ๊ฒฝ์ฐ์๋ง ์ ํ์ด "์๋ชป"๋ฉ๋๋ค. ๋ฐฐ์ด์์ ์ฝ๋ ๋๋ถ๋ถ์ ์ฝ๋๋ ๋ฒ์ ๋ด์์ ๊ทธ๋ ๊ฒ ํฉ๋๋ค. ์ด ์ธ์์ ์ํด ์ด๋ฌํ ๊ฒฝ์ฐ์ undefined
๋ฅผ ํฌํจํ๋ ๊ฒ์ "์๋ชป"๋ฉ๋๋ค.
... ์ปดํ์ผ์ ์คํจํ ์์ ์ฝ๋
๋๋ ์ ํ ์์ง ๋ชปํฉ๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ์ง์ ํ ์ ์์ต๋๊น?
์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋จ์ํ๊ฒ ์ ์งํ๊ณ ๊ตฌ์ for ๋ฃจํ ์ฃผ์์ ๋ง์ ๋์์ ์ ํ ์ถ๊ฐํ์ง ์์ ์ ์์ต๋๊น? ๋น์ ์ ํญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค! ์ผ์ด ์๋ํ๋๋ก ํฉ๋๋ค.
"๋ชจ๋ ๋ฐฐ์ด ์ก์ธ์ค ํํ์์๋ !
ํํ์ด ์์ด์ผ ํจ"์ด๋ผ๋ TSLint ๊ท์น๊ณผ ์ด ๊ท์น์ ์ ์ฉํ ์ฐจ์ด์ ์ ๋ฌด์์
๋๊น?
@RyanCavanaugh ๋ด ๊ฐ์ ์ TSLint ๊ท์น์ด ์ ํ์ ์ขํ๊ฑฐ๋ ์ ์ด ํ๋ฆ ์ ํ ๋ถ์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค(์: if
์ก์ธ์ค ๋ํ, ์์ธ ๋ฐ์, return
ing ๋๋ continue
์ค์ ๋์ง ์์ ๊ฒฝ์ฐ https://github.com/Microsoft/TypeScript/issues/13778#issuecomment -336265143์ ์์์ ๊ตฌํ์ ์ด๋ป๊ฒ ๋ฉ๋๊น? !
๋ฅผ ์ ์ฉํ๋ ค๋ฉด ๋ณธ์ง์ ์ผ๋ก ์ด๋ฌํ ๋ณ์์ ์ ํ์ undefined
๋ก ์ถ์ ํ๋ ํ
์ด๋ธ์ ์์ฑํด์ผ ํฉ๋๋ค. ๋์๊ฒ ์ด๊ฒ์ linter๊ฐ ์๋๋ผ type checker๊ฐ ํด์ผ ํ ์ผ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
@RyanCavanaugh
๋์๊ฒ ์ด ๋จ๋ฝ์ ์ด ๊ธฐ๋ฅ์ด ์๋ ์ข์ ์ด์ ์ฒ๋ผ ์ฝํ๋๋ค. ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ฐฐ์ด์ ์ก์ธ์คํ๋ ๊ฒ์ ์ด์ํ ์ผ์ ๋๋ค. ์ผ๋ฐ์ ์ด์ง ์์ ์ผ(OOBing)์ ์ํํ๋ ๊ฒฝ์ฐ์๋ง ์ ํ์ด "์๋ชป"๋ฉ๋๋ค.
... ์ปดํ์ผ์ ์คํจํ ์์ ์ฝ๋
๋๋ ์ ํ ์์ง ๋ชปํฉ๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ์ง์ ํ ์ ์์ต๋๊น?
์ ๊ฒฝ์ฐ์๋ ์ด๋ ์ด๊ฐ ์๋์์ง๋ง ์์์๋ก ํ์๋์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ์ด์ผ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ด ์๋ ๋ฌธ์ ๋ #11186์ ์ฐธ์กฐํ์ธ์. ํ์ผ์ ๋งต์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์ํ ๋ค์ undefined
์ ๋ํด ํ์ธํ์ต๋๋ค. IIRC ๋น๊ต์์ ์ ์ํ ์๋ ์์ง๋ง ์ ์ํ ์๋ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
ํญ์ undefined
์ ๋น๊ตํ ์ ์์ต๋๋ค.
๋ถ๋๋ฌ์ด ์ผ
const canWeDoIt = null === undefined; // yes we can!
ํญ์
undefined
์ ๋น๊ตํ ์ ์์ต๋๋ค.
๋๋ฌด ์ค๋๋์ด์ ์ค๋ฅ๊ฐ ๋ฌด์์ธ์ง ์ ํํ ๊ธฐ์ตํ์ง ๋ชปํฉ๋๋ค. ๋๋ ํ์คํ ( strictNullChecks
์์ด) ์ ์๋ํ๋ ์ฝ๋์ ๋ํ ์ค๋ฅ๊ฐ ์์๊ณ ๊ทธ๊ฒ์ ์์ ๊ฒฝ์ฐ๋ฅผ ์ด๋ํ ํ
์คํธ๋ก ๋๋ฅผ ์ด๋๋ค.
์๊ฐ์ด ๋๋ค๋ฉด ์ ํํ ์ด๋ค ๋ด์ฉ์ธ์ง ๋ค์ ํ๋ฒ ์์๋ด์ผ๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ํ์คํ ์ด ํ์ดํ๊ณผ ๊ด๋ จ์ด ์์์ต๋๋ค.
์ด ๋ ผ์์ ๋๋ถ๋ถ์ ๋ฐฐ์ด์ ์ด์ ์ ๋ง์ถ์์ง๋ง ์ ๊ฒฝํ์ ๊ฐ์ฒด ์ก์ธ์ค๋ ์ด ๊ธฐ๋ฅ์ด ๊ฐ์ฅ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ด ์ฝ๋๋ฒ ์ด์ค์ ์ด (๋จ์ํ) ์์ ๋ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ด๊ณ ์ ์ปดํ์ผ๋์ง๋ง ๋ถ๋ช ํ ๋ฒ๊ทธ์ ๋๋ค.
export type Chooser = (context?: Context) => number | string;
export interface Choices {
[choice: number]: Struct;
[choice: string]: Struct;
}
export const Branch = (chooser: Chooser, choices: Choices, context?: Context): Struct => {
return choices[chooser(context)]; // Could be undefined
}
๊ฐ์ฒด์ ๊ด๋ จํ์ฌ | undefined
๋ฅผ ํฌํจํ๋๋ก ์๋ช
์ ๋ณ๊ฒฝํ๋ฉด @types/node
process.env
.
export interface ProcessEnv {
[key: string]: string | undefined;
}
๊ทธ๋ฌ๋ ์ ํ์ ์ขํ๋ ๊ฒ์ ์ ํ ํ์ฉํ์ง ์์ต๋๋ค.
process.env.SOME_CONFIG && JSON.parse(process.env.SOME_CONFIG)
์ค๋ค
[ts]
Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
Type 'undefined' is not assignable to type 'string'.
@felixfbecker
์ด ๋ฒ๊ทธ์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. https://github.com/Microsoft/TypeScript/issues/17960
env var๋ฅผ ๋ณ์์ ํ ๋นํ๊ณ ๋ค์์ ๋ณดํธํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
const foo = process.env.SOME_CONFIG
foo && JSON.parse(foo);
์ผ๋ถ ๋
ธ๋ ์ ํ์ | undefined
๋ฅผ ์ถ๊ฐํ์ฌ ์ฝ๋ ์์ฑ์ ์ํด ์์ฃผ ์ฌ์ฉ๋๋ ์์ฑ์ผ๋ก ํธ์๋ฅผ ์ํด ์ด๋ฌํ ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ ์ ์์ต๋๋ค. ์์
interface ProcessEnv {
foo?: string;
bar?: string;
}
์ธ๋ฑ์ค ์๋ช
์ | undefined
๊ฐ ์์ผ๋ฉด TSC๋ Property 'foo' of type 'string | undefined' is not assignable to string index type 'string'.
๋ถํํฉ๋๋ค.
์ถ๊ฐ | undefined
๊ฐ ์๋ ์ ํ๊ณผ ๊ทธ๋ ์ง ์์ ์ ํ์ผ๋ก ์์
ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋น์ฉ์ด ๋ ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์์จ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ์๊ฐ์ ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค.
JavaScript์์ ๊ฐ์ฒด๋ ํผํฉ ๋ฐฑ์ ๋๋ค. ๋ ๊ฐ์ง ์ฉ๋ ๋ก
๋ ์ฝ๋๋ก ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค ์๋ช
์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ๋์ ์๋ ค์ง ํค๊ฐ ์ธํฐํ์ด์ค ์ ํ์ ์ ์๋ฉ๋๋ค. ์ ํจํ ํค ์กฐํ๋ ํด๋น ์ ํ์ ๋ฐํํ๊ณ ์ ํจํ์ง ์์ ํค ์กฐํ๋ ์ธ๋ฑ์ค ์๋ช
์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์ ์๋ ์ธ๋ฑ์ค ์๋ช
์ด ์๊ณ (๋ ์ฝ๋๋ก ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ ๋ํด ์์ด์ผ ํจ) noImplicitAny
๊ฐ ํ์ฑํ๋์ด ์์ผ๋ฉด ์ํ๋ ๋๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ์ (์ผ๋ช
๋งต) ๋ฐ ๋ฐฐ์ด๋ก ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค ์๋ช
์ด ์ฌ์ฉ๋๋ฉฐ ๊ฐ ์ ํ์ | undefined
๋ฅผ ํฌํจํ๋๋ก ์ ํํ ์ ์์ต๋๋ค. ์: { [key: index]: string | undefined }
. ๋ชจ๋ ํค ์กฐํ๋ ์ ํจํ๋ฉฐ(์ปดํ์ผ ์ ํค๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์) ๋ชจ๋ ํค๋ ๋์ผํ ์ ํ์ ๋ฐํํฉ๋๋ค(์ด ์์์๋ T | undefined
).
์ธ๋ฑ์ค ์๋ช
์ ์ฌ์ ๊ฐ์ฒด ํจํด ๋ฐ ๋ฐฐ์ด์๋ง ์ฌ์ฉํด์ผ ํ๋ฏ๋ก TypeScript๊ฐ ์ธ๋ฑ์ค ์๋ช
๊ฐ ์ ํ์์ | undefined
๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค. ํค๋ฅผ ์ ์ ์๊ณ ํค ์กฐํ๊ฐ undefined
๋ฐํํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ
Array.prototype.find
undefined
๋ฐํํ๊ฑฐ๋ array[0]
undefined
๋ฐํํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ด๊ฒ์ด ์์ผ๋ฉด ๋ณด์ด์ง ์๋ ๋ฒ๊ทธ์ ์ข์ ์๊ฐ ์์ต๋๋ค. (๋น๊ตฌ์กฐํ๋ ํค ์กฐํ๋ฅผ ์ํ ์คํ ๊ตฌ๋ฌธ์ผ ๋ฟ์
๋๋ค.) getKey
์ ๊ฐ์ ํจ์๋ฅผ ์์ฑํ์ฌ ๋ฐํ ์ ํ์ ์์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง ์ฝ๋๋ฒ ์ด์ค์์ ์ด๋ฌํ ํจ์์ ์ฌ์ฉ์ ๊ฐ์ ํ๋ ค๋ฉด ์์น์ ์์กดํด์ผ ํฉ๋๋ค.
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ฉด ๋ฌธ์ ๋ ์ฌ์ ๊ฐ์ฒด ๋ฐ ๋ฐฐ์ด์ ๋ํ ๋ฐ์ฌ์ ๊ดํ ๊ฒ์ด๋ฏ๋ก ์ฌ์ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ ํค๋ฅผ ๋งคํํ ๋ ํค ์กฐํ๊ฐ ์ ํจํ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค. ์ฆ, undefined
๋ฐํํ์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๊ฐ ์ ํ์ undefined
๊ฐ ํฌํจ๋๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์ด ํ๋ฆ ๋ถ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ฏธํด๊ฒฐ ๋ฌธ์ ์ ๋๊น, ์๋๋ฉด ์ ๊ฐ ์คํดํ๊ณ ์์ต๋๊น?
๋ด๊ฐ ์ธ๊ธํ์ง ์์ ์ฌ์ฉ ์ฌ๋ก์ ๋ฌธ์ ๋ ๋ฌด์์ ๋๊น?
๊ฐ์ฒด ์ ํ ์ ์์ undefined๋ฅผ ๋ฃ๋ ๋ฐ๋ (์ ์ด๋) ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- ์ด๊ฒ์ ๋ถ๋ช ํ ์๋ํ์ง ์์ ์ด๋ฌํ ๊ฐ์ฒด์ undefined๋ฅผ ํ ๋นํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
- Object.values(๋๋ _.values)์ ๊ฐ์ ๋ค๋ฅธ ์์ ์์๋ ๊ฒฐ๊ณผ์์ ์ ์๋์ง ์์ ๊ฒ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ์ค์ํ ํฌ์ธํธ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์์ ์คํํ๊ณ ์์ต๋๋ค.
const safelyAccessProperty = <T, K extends keyof T>(object: T, key: K): T[K] | undefined => object[key];
์ ์
๊ทธ๋ฐ ๋ค์ myObject[myKey]
๋์ safelyAccessProperty(myObject, myKey)
์ ๊ฐ์ ์์ฑ์ ์ก์ธ์คํฉ๋๋ค.
@plul ์ ์ก์์ต๋๋ค. ๋
ผ์๋ ํ์ฌ ์ฝ๊ธฐ ์์
์ ์ค์ ์ ๋๊ณ ์์ง๋ง ์ธ๋ฑ์ ์ ํ ์ ์๋ ์ค์ ๋ก ๋ ๊ฐ์ง์ด๋ฉฐ | undefined
๋ฅผ ์ถ๊ฐํ๋ฉด undefined
๊ฐ์ ์ธ ์ ์์ต๋๋ค.
์คํ ์ค์ธ safelyAccessProperty
ํจ์( ์์์ @OliverJAsh์์
์ด ๊ธฐ๋ฅ์ ๋ชจ๋ ์ด๋ ์ด ์ค๋ธ์ ํธ ์ธ์คํด์ค (์ธ๋ฑ์ ์์
์ ์ ๊ณต ๋ชจ๋ ์ ํ)์ ์ ๊ณต๋๋ ๊ฒฝ์ฐ, ํ์ฅํ๋ค ++ C์์ ๊ฐ์ ์ std::vector
๊ฐ๋๋ค .at()
OOB ์ก์ธ์ค ๋ฐํ์ ์์ธ๋ฅผ ๋ฐ์ ์ด๋ ๋ฐ ํ์ธ๋์ง ์์ []
์ฐ์ฐ์๋ ์ต์์ ๊ฒฝ์ฐ OOB ์ก์ธ์ค์์ SEGFAULT์ ์ถฉ๋ํ๊ณ ์ต์
์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์์ํต๋๋ค.
OOB ์ก์ธ์ค ๋ฌธ์ ๋ TypeScript/JavaScript์ ์ ํ ์ ์ ์์ค๋ง์ผ๋ก๋ ํด๊ฒฐํ ์ ์์ผ๋ฉฐ ์ด ์๊ฒฉ์ฑ ๊ธฐ๋ฅ์ด ํ์ฑํ๋ ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ์ํํ ์ธ๋ฑ์ ์์ ์ ์ ํํ๊ธฐ ์ํด ์ธ์ด ์ง์์ด ํ์ํฉ๋๋ค.
์ธ๋ฑ์์ ์ด์ค ํน์ฑ์ get
๋ฐ set
์์
์ ํจ์๋ก ์ฌ์ฉํ์ฌ ์์ฑ์ผ๋ก ๋ชจ๋ธ๋งํ ์ ์์ง๋ง ์ด๋ ๊ธฐ์กด์ ๋ชจ๋ ์ธ๋ฑ์ ์ ํ ์ ์์ ๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์
๋๋ค.
์ ๋งํ ๊ฒ ๊ฐ์ ํ ๊ฐ์ง ์์ด๋์ด: ์ธ๋ฑ์ค ์๋ช
์ ์ ์ํ ๋ ?:
์ฌ์ฉํ์ฌ ์ ์์ ์ธ ์ฌ์ฉ์์ ๋๋๋ก ๊ฐ์ด ๋๋ฝ๋ ๊ฒ์ผ๋ก ์์ํ๋ค๋ ๊ฒ์ ๋ํ๋ผ ์ ์๋ค๋ฉด ์ด๋จ๊น์? ์์์ ์ธ๊ธํ | undefined
์ฒ๋ผ ์๋ํ์ง๋ง ๋ถํธํ ๋จ์ ์ด ์์ต๋๋ค. ๋ช
์์ ์ธ undefined
๊ฐ์ ํ์ฉํ์ง ์์์ผ ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ธ ?:
์ ์ฐจ์ด์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ ๋๋ค.
type NewWay = {[key: string]?: string};
const n: NewWay = {};
// Has type string | undefined
n['foo']
// Has type Array<string>
Object.values(n)
// Doesn't work
n['foo'] = undefined;
// Works
delete n['foo'];
| undefined
์ ์ด์ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋น๊ต:
type OldWay = {[key: string]: string | undefined};
const o: OldWay = {};
// Has type string | undefined
o['foo']
// Has type Array<string | undefined>
Object.values(o)
// Works
o['foo'] = undefined;
// Works
delete o['foo'];
์์ DT PR์ | undefined
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฑฐ๋ถํ์ฌ ์ฌ๊ธฐ๊น์ง ์์ต๋๋ค. API์ ๊ธฐ์กด ์ฌ์ฉ์๊ฐ ๋ชจ๋ ์ค๋จ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋์๊ด๋ณด๋ค?
์ ํ์ ์์ฑ์ | undefined
๋ ์ถ๊ฐ๋๋ค๋ ์ ์ ์ ์ํ๊ฒ ์ต๋๋ค. ์ด๋ ๋ช ๋ฒ์ด๋ ์ ๋ฅผ ๊ดด๋กญํ์ต๋๋ค. ๋ณธ์ง์ ์ผ๋ก TS๋ ๋๋ฝ๋ ์์ฑ๊ณผ ์ ์๋์ง ์์ ์์ฑ์ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. ๋๋ { foo?: T, bar?: T }
๊ฐ { [name: 'foo' | 'bar']: T }
์ ๋์ผํ๊ฒ ์ทจ๊ธ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค(์์ process.env
์ฃผ์ ์ฐธ์กฐ).
TS๋ ์ซ์ ๋ฐ ๋ฌธ์์ด ์ธ๋ฑ์์์ ๋์นญ์ ๊นจ๋ ๊ฒ์ ๋ฐ๋ํฉ๋๊น?
foo[bar] && foo[bar].baz()
๋ ๋งค์ฐ ์ผ๋ฐ์ ์ธ JS ํจํด์ด๋ฉฐ TS์์ ์ง์ํ์ง ์์ ๋ ์ด์ํ๊ฒ ๋๊ปด์ง๋๋ค( | undefined
์ถ๊ฐํ์ง ์์ผ๋ฉด ์ถ๊ฐํด์ผ ํจ์ ์๊ธฐ์ํค๊ณ ์ถ๊ฐํ ๋ ๊ฒฝ๊ณ ํ๋ค๋ ์๋ฏธ์์). ๋น์ ์ด ํ ๊ฒฝ์ฐ ๋ถ๋ช
ํ ํ์ํ์ง ์์ต๋๋ค).
๊ฐ๋ ํํ์ ๋ณด์ฅ์ ๊นจ๋ ๋ฐ๋ณต ์ค์ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ๋ค๋ฅธ ๊ฐ๋์์๋ ๊ฐ๋ฅํฉ๋๋ค.
class Foo {
foo: string | number = 123
bar() {
this.foo = 'bar'
}
broken() {
if (typeof this.foo === 'number') {
this.bar();
this.foo.toLowerCase(); // right, but type error
this.foo.toExponential(); // wrong, but typechecks
}
}
}
๊ทธ๋ฌ๋ ์ค์ ์ฝ๋์์๋ ์ค๋๋ ๋ฃจํ๊ฐ ๋ฐ๋ณต์ ๋ณ๊ฒฝํ๋ ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ์ ์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ํ ์์๊ฐ ์๋ ๊ฒ์ ๋ถ๋ช
ํฉ๋๋ค. TSํ์ด ํด๊ฒฐ์ฑ
์ ์ฐพ๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๋ฐ๋๋๋ค. ์์ฒด ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์์ | undefined
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋๋ผ(์ด๋ฏธ ์ธ๊ธ๋จ) ๋ "์๋ฆฌํ" ๋ฐฉ์์ผ๋ก(์ฝ์ผ๋ฉด T|undefined
๋ฐํ, ์ฐ๊ธฐ์๋ T
, ์ข์ ์ปดํ์ผ๋ฌ ํ์) for
๋ฃจํ ๋ฑ์ ํ์ธํ๋ ๋ฑ ์ข์ ์ ์๋ ์ด๋ฏธ ์ธ๊ธํ์ต๋๋ค.)
์ปดํ์ผ๋ฌ ๋ฐฉ์์ผ๋ก ํ์ธํ๊ธฐ ์ด๋ ค์ด ์ฌ์ํ์ง ์์ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ๊ณ ์์
ํ ๋ ๋ฐํ์ ์ค๋ฅ๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ํ๊ณ ๊ฐ๋ !
ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฆ, ์ด๋ณด๋ค ์๊ฒฉํ ๋ฐฐ์ด ์ฒ๋ฆฌ๊ฐ ๊ตฌํ๋๋ค๋ฉด ์ด์ #24897์ ์ฌ์ฉํ์ฌ ์์๋ก ๋ฐฐ์ด ๊ธธ์ด๋ฅผ ํ์ธํ ๋ ๋ฉ์ง ์ ํ ์ถ์๋ฅผ ๊ตฌํํ ์ ์์ ๊ฒ์ ๋๋ค. ๋๋จธ์ง ์์์ ํํ๋งํ๋๋ก ๋ฐฐ์ด์ ์ขํ ์ ์์ต๋๋ค.
let arr!: string[];
if (arr.length == 3) {
//arr is of type [string, string, string]
}
if (arr.length > 3) {
//arr is of type [string, string, string, string, ...string[]]
}
if (arr.length) {
//arr is of type [string, ...string[]]
}
if (arr.length < 3) {
//arr is of type [string?, string?, string?]
if (arr.length > 0) {
//arr is of type [string, string?, string?]
}
}
์์๋ก ์ธ๋ฑ์ฑํ๊ฑฐ๋ ๋ฐฐ์ด์ ๊ตฌ์กฐํํ ๋ ์ ์ฉํฉ๋๋ค.
let someNumber = 55;
if (arr.length) {
let el1 = arr[0]; //string
let el2 = arr[1]; //string | undefined
let el3 = arr[someNumber]; //string | undefined
}
if(arr.length >= 3){
let [el1, el2, el3, el4] = arr;
//el1, el2, el3 are string
// el4 is string | undefined
}
if (arr.length == 2){
let [el1, el2, el3] = arr; //compiler error: "Tuple type '[string, string]' with length '2' cannot be assigned to tuple with length '3'.",
}
๋ค๋ฅธ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ํฐ ์ซ์๋ก ๋ฌด์์ ํ ๊ฒ์ธ๊ฐ์ ๋๋ค.
if(arr.length >= 99999){
// arr is [string, string, ... , string, ...string[]]
}
IDE ๋๋ ์ปดํ์ผ๋ฌ ๋ฉ์์ง์์ ์ด ๊ฑฐ๋ํ ํํ์ ์ ํ์ ํ์ํ ์ ์์ต๋๋ค.
"๋ชจ๋ ํญ๋ชฉ์ ๋ํด ๋์ผํ ์ ํ์ ํน์ ๊ธธ์ด์ ํํ"์ ๋ํ๋ด๋ ๊ตฌ๋ฌธ์ด ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด 1000๊ฐ ๋ฌธ์์ด์ ํํ์ string[10000]
์ด๊ณ ์์ ์์์ ์ข์ ๋ฐฐ์ด์ ์ ํ์ [...string[99999], ...string[]]
์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ฌธ์ ๋ ์ปดํ์ผ๋ฌ ์ธํ๋ผ๊ฐ ์ง๊ธ ๊ทธ๋ฌํ ํฐ ํํ์ ์ง์ํ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ์ง ์๋ค๋ฉด ์ผ๋ง๋ ์ด๋ ค์ด ์ผ์ธ์ง์ ๋๋ค.
์ฌ๋ฌผ
๋๋ ํญ์ [key: string (or number, symbol)]: V |ย undefined
์ ์ธ๋ฑ์ค ์ ํ์ ์ํ์ง๋ง ๋๋๋ก undefined
๊ฒฝ์ฐ๋ฅผ ์์ด๋ฒ๋ฆฝ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ปดํ์ผ๋ฌ์๊ฒ "๋๋ฅผ ๋ฏฟ์ผ์ญ์์ค. ์ด๊ฒ์ ์ค์ ๋ก ๊ทธ๋ฐ ์ ํ์
๋๋ค"๋ผ๊ณ ๋ช
์์ ์ผ๋ก ์๋ ค์ผ ํ ๋๋ง๋ค ์์ ํ์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
Map.get
์ ์ ํ๊ฒ(์๊ฒฉํ๊ฒ) ์
๋ ฅํ๋ ๊ฒ์ ๊ฑฐ์ ์๋ฏธ๊ฐ ์์ง๋ง ์ด๋ป๊ฒ๋ ์ผ๋ฐ ๊ฐ์ฒด๋ ์์ ํจ์ค๋ฅผ ๋ฐ์ต๋๋ค.
๊ทธ๋๋ ์ด๊ฑด ์ ์ ๋๋์์ ์ฝ๊ฒ ๊ณ ์น ์ ์์ด์ ๋์์ง๋ ์๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ํด๊ฒฐ์ฑ
์ด ์์ต๋๋ค.
๋ฐฐ์ด
์๋ง๋ ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์์ง ๋ชจ๋ฅด์ง๋ง "์์ ํ์ง ์์ ๋ฐฉ์์ผ๋ก ๋ฐฐ์ด์ ๊ฑฐ์ ์ก์ธ์คํ์ง ์๋๋ค"๋ ์ฃผ์ฅ์ ํนํ ์๋ก์ด ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฐฉํฅ์ผ๋ก ๊ฐ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ์ ๋ ๋ง์ ์ฌ๋๋ค์ด ๋ค์ ๋ ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ ์๋ค๊ณ ์๊ฐํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์ด๋ฅผ ์ผ๋์ ๋๊ณ ๋ฎ์ ์์ค์ ๋ธ๋ํท ์ก์ธ์ค ๋ ผ๋ฆฌ๊ฐ ํ์ํ ์ ์ผํ๊ณ ๋๋ฌธ ๊ฒฝ์ฐ๋ ์ ํ ์์ ์ฑ์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค.
์ด๊ฒ์ ์๋ฌด ์๊ฐ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ์ ์ฒด lib.d.ts๋ฅผ ๋ก์ปฌ๋ก ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๋ ๊ฒ์ด ํ์ฉ ๊ฐ๋ฅํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ( array[0]
)์ ์ป๊ธฐ ์ํด ๋ฐฐ์ด/๊ฐ์ฒด๋ฅผ ๋ช
์์ ์ผ๋ก ์ธ๋ฑ์ฑํ ๋ ๊ฒฐ๊ณผ์ undefined
๊ฐ ํฌํจ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ธ๋ฑ์ค ์๋ช
์ undefined
๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ์ธ๋ฑ์ค ์๋ช
์ undefined
๋ฅผ ํฌํจํ๋ ๋ฌธ์ ๋ ๋ฐฐ์ด ๋๋ ๊ฐ์ฒด์ ๋งคํํ ๋ ๊ฐ์ undefined
๊ฐ ํฌํจ๋์ง ์๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ง๋ง undefined
(๊ทธ๋ ์ง ์์ผ๋ฉด ๋งคํํ์ง ์์ ๊ฒ์
๋๋ค).
์ธ๋ฑ์ค ์ ํ/์๊ทธ๋์ฒ๋ ์ธ๋ฑ์ค ์กฐํ(์: array[0]
) ๋ฐ ๋งคํ(์: for
๋ฃจํ ๋ฐ Array.prototype.map
) ๋ชจ๋์ ์ฌ์ฉ๋์ง๋ง ์ด๋ฌํ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ๋ํด ๋ค๋ฅธ ์ ํ์ด ํ์ํฉ๋๋ค.
Map.get
๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ Map
์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ผ๋ฉฐ, ๋ฐ๋ผ์ ํจ์๊ฐ ์๋ ๋ฐฐ์ด/๊ฐ์ฒด๋ก ์ธ๋ฑ์ฑํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ๋ฐํ ์ ํ์ ๋ด๋ถ ๊ฐ ์ ํ๊ณผ ๋ถ๋ฆฌ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ธ๋ฑ์ค ์๋ช
์ ์ง์ ์ฌ์ฉํฉ๋๋ค.
๋ฐ๋ผ์ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด๋ป๊ฒ ๋ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ๋ง์กฑ์ํฌ ์ ์์ต๋๊น?
// Manually adding `undefined` to the index signature
declare const array: (number | undefined)[];
const first = array[0]; // number | undefined, as desired :-)
type IndexValue = typeof array[0]; // number | undefined, as desired! :-)
array.map(x => {
x // number | undefined, not desired! :-(
})
์ธ๋ฑ์ค ๊ฐ ์ ํ์ undefined
๋ฅผ ํฌํจํ์ฌ Set.get
๋ฐ Map.get
๊ฐ ์
๋ ฅ๋๋ ๋ฐฉ์๊ณผ ์ ์ฌํ ์ธ๋ฑ์ค ์กฐํ(์: array[0]
)๋ฅผ ์ฒ๋ฆฌํ๋ ์ปดํ์ผ๋ฌ ์ต์
(์: undefined
์ธ๋ฑ์ค ์๋ช
์์ฒด). ์ค์ ์ธ๋ฑ์ค ์๋ช
์์ฒด์๋ undefined
๊ฐ ํฌํจ๋์ง ์์ผ๋ฏ๋ก ๋งคํ ๊ธฐ๋ฅ์ด ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
์์:
declare const array: number[];
// The compiler option would include `undefined` in the index value type
const first = array[0]; // number | undefined, as desired :-)
type IndexValue = typeof array[0]; // number | undefined, as desired :-)
array.map(x => {
x // number, as desired :-)
})
๊ทธ๋ฌ๋ ์ด ๊ธฐ์ ์ ์ธ๋ฑ์ค ์กฐํ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก for
๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด/๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ๋ ํด๊ฒฐ๋์ง ์์ต๋๋ค.
for (let i = 0; i < array.length; i++) {
const x = array[i];
x; // number | undefined, not desired! :-(
}
๋์ ๋๋ ๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค์ด for
๋ฃจํ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋์ Array.prototype.map
์ ๊ฐ์ ๊ธฐ๋ฅ์ ์คํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ํ์ฉ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ null์ด ์๋ ์ฃผ์ฅ ์ฐ์ฐ์์ ํจ๊ป ์ฌ๊ธฐ์ ์ ์๋ ์ปดํ์ผ๋ฌ ์ต์
์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค.
for (let i = 0; i < array.length; i++) {
const x = array[i]!;
x; // number, as desired :-)
}
์๋ฅผ ๋ค์ด ์ธ๋ฑ์ค ์๋ช ์ ์ฅ์ํ๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ตํธ์ธ ๋๋ ์ตํธ์์ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ์๋ ์์ต๋๋ค(์๋ฅผ ๋ค์ด ๋ด๊ฐ ์๊ฐํด๋ธ ๋ชจํธํ ๊ตฌ๋ฌธ์ ์ฉ์ํ์ญ์์ค). ์ด ๊ตฌ๋ฌธ์ ์ธ๋ฑ์ค ์กฐํ์ ๋ํด ์ํ๋ ๋์์ ์ ํธํ๋ ๋ฐฉ๋ฒ์ผ ๋ฟ์ ๋๋ค.
์ตํธ์์(์ปดํ์ผ๋ฌ ์ต์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋๋ฉฐ ํ์ํ ๊ฒฝ์ฐ ์ตํธ์์):
declare const array: { [index: number]!!: string };
declare const dictionary: { [index: string]!!: string }
์ตํธ์ธ(์ปดํ์ผ๋ฌ ์ต์ ์์, ํ์ํ ๊ฒฝ์ฐ ์ตํธ์ธ):
declare const array: { [index: string]!!: string };
declare const dictionary: { [index: string]??: string }
๋๋ ์ด ๋ฌธ์ ๋ ์ฐฌ๋ฐ ์๋ก , ๋ค์ํ ์ ์ ๋ฑ์ ๋ํด ์ฝ์ง ์์์ต๋๋ค. (๋ฐฐ์ด/๊ฐ์ฒด ์ก์ธ์ค๊ฐ ์๊ฒฉํ null ๊ฒ์ฌ๋ก ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌ๋์ง ์๋๋ค๋ ์ฌ์ค์ ๋ฐ๋ณต์ ์ผ๋ก ๋๋ ํ Google์์ ๋ฐ๊ฒฌํ์ต๋๋ค.) ๊ด๋ จ ์ ์: ํน๋ณํ ์ฌ์ ์๋์ง ์๋ ํ ๋ฐฐ์ด ์ ํ ์ถ๋ก ์ ๊ฐ๋ฅํ ํ ์๊ฒฉํ๊ฒ ๋ง๋๋ ์ต์ ์ ๋๋ค.
์๋ฅผ ๋ค์ด:
const balls = [1, 2 ,3];
๊ธฐ๋ณธ์ ์ผ๋ก balls
๋ [number, number, number]
๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ฌ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
const balls: number[] = [1, 2 ,3];
๋ํ ํํ ์์ ์ก์ธ์ค๋ ์๊ฒฉํ null ๊ฒ์ฌ๋ก ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ค์ ์์ ์์ n
๋ ์๊ฒฉํ null ๊ฒ์ฌ๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ์๋ ํ์ฌ number
๋ก ์ ์ถ๋๋ค๋ ๊ฒ์ด ๋๋์ต๋๋ค.
const balls: [number, number, number] = [1, 2 ,3];
const n = balls[100];
๋ํ .push
์ ๊ฐ์ ๋ฐฐ์ด ๋ณํ ๋ฐฉ๋ฒ์ ํํ ์ ํ ์ ์์ ์กด์ฌํ์ง ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ด๋ฌํ ๋ฉ์๋๋ ๋ฐํ์ ์ ํ์ ์ปดํ์ผ ์๊ฐ ์ ํ๊ณผ ์ผ์นํ์ง ์๋๋ก ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์
๋๋ค.
@buu700 TypeScript 3.0์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค: https://blogs.msdn.microsoft.com/typescript/2018/07/30/announcing-typescript-3-0/#richer -tuple-types
๋ฉ์ง! ํฅ๋ฏธ๋ก์ด ํ์ด๋ฐ์ด๋ค์. ๋๋ ์ถ์ ๋ฐํ๋ฅผ ์ด์์ง๋ง ์์ง ๊ทธ๊ฒ์ ์ฝ์ง ์์์ต๋๋ค. TypeScript(2.9)๊ฐ ๋ด๊ฐ ์ํ๋ ๋๋ก ์๋ํ๋๋ก ํ๊ธฐ ์ํด ์ด์ํ ์บ์คํ
( (<(T|undefined)[]> arr).slice(-1)[0]
)์ ์ํํด์ผ ํ๋ ์ํฉ์ ์ฒํ ํ์์ผ ์ฌ๊ธฐ์ ์์ต๋๋ค.
์ด ์ ์์ผ๋ก ๋์๊ฐ๊ณ ์ถ์์ต๋๋ค. https://github.com/Microsoft/TypeScript/issues/13778#issuecomment -383072468
์ด๊ฒ์ ๋ด๊ฐ ๊ฒฝํํ ์ธ๋ฑ์ฑ๋ ์ ํ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ด๋ฉด ์ข๊ฒ ์ง๋ง ํ์ค ์ธ๊ณ์์ ๋ง์ ๊ฒ์ ๊นจ๋จ๋ฆด ๊ฒ์ด๋ผ๋ ์ ์ ์ดํดํฉ๋๋ค.
@mhegazy @RyanCavanaugh ๋ด ์ ์์ https://github.com/Microsoft/TypeScript/issues/13778#issuecomment -406316164
์ ์๊ฒ๋ ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค. ์ด๋ฅผ ํ์ธํ๋ ํ๋๊ทธ๋ฅผ ํ์ฑํํ์ญ์์ค. ๊ทธ๋ฐ ๋ค์ ๋์ :
const array = [1, 2, 3];
for (var i =0; i< array.length; i++) {
array[i]+=1; // array[i] is possibly undefined
}
๋น์ ์:
const array = [1, 2, 3];
array.forEach((value, i) => array[i] = value + 1);
๊ทธ๋ฐ ๋ค์ ์์ ์ธ๋ฑ์ค ์ก์ธ์ค๋ฅผ ์ํํ ๋ ๊ฒฐ๊ณผ๊ฐ ์ ์๋์ง ์์๋์ง ํ์ธํด์ผ ํ์ง๋ง ์ด๊ฑฐํ ์ปฌ๋ ์ ์ ๋ฐ๋ณตํ๋ ๋์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๋๋ ์ฌ์ ํ ์ด๊ฒ์ด ๋ฏธํด๊ฒฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
TypeScript๋ฅผ ์ฒ์ ์ ํ๋ ํ๋ก๊ทธ๋๋จธ๋ก์ ์๊ฒฉ ๋ชจ๋์์ ๊ฐ์ฒด๋ฅผ ์ธ๋ฑ์ฑํ๋ ์ํฉ์ด ์ง๊ด์ ์ด์ง ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋๋์ด ๋ ์์๋ ์กฐํ์ ๊ฒฐ๊ณผ๋ฅผ ์์ํ์ ๊ฒ T | undefined
์ ์ฌ์, Map.get
. ์ด์จ๋ , ๋๋ ์ต๊ทผ์ ์ด๊ฒ์ ๋ง๋ฌ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฌธ์ ๋ฅผ ์ด์์ต๋๋ค.
์คํฌ๋ฆฌํผ/ํ์ดํ๋ ์คํฌ๋ฆฌํ#107
์ข์ ํด๊ฒฐ์ฑ
์ด ์๋ ๊ฒ ๊ฐ์์ ์ง๊ธ ๋ซ์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฝ๊ฐ์ ์ ํธ๋ฆฌํฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ T | undefined
์ "์ ํ"์ ์๋ํ๋ ค๊ณ ํฉ๋๋ค.
export function lookup<T>(map: {[index: string]: T}, index: string): T|undefined {
return map[index];
}
์ฌ๊ธฐ์ T | undefined
๋ฅผ ๊ฐ์ฒด ์ธ๋ฑ์ค ์์
๋ฐํ ์ ํ์ผ๋ก ๋ช
์์ ์ผ๋ก ์ค์ ํ๋ ๋ช ๊ฐ์ง ์ ์์ด ์์์ง๋ง ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
const obj: {[key: string]: number | undefined} = {
"a": 1,
"b": 2,
};
const test = obj["c"]; // const test: number
์ด๊ฒ์ VSCode ๋ฒ์ 1.31.1์ ๋๋ค.
@yawaramin tsconfig.json
์์ strictNullChecks
ํ์ฑํ๋์ด ์๋์ง ํ์ธํ์ญ์์ค( strict
ํ๋๊ทธ๋ก๋ ํ์ฑํ๋จ)
์ฌ์ฉ ์ฌ๋ก์ ์ ์ ์๋ ๊ธธ์ด์ ๋ฐฐ์ด์ ๋ํ ์์์ ์ธ๋ฑ์ฑ์ด ํ์ํ ๊ฒฝ์ฐ undefined๋ฅผ ๋ช ์์ ์ผ๋ก ์ถ๊ฐํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค(๊ทธ ๋ถ์์ ์ฑ์ "๋ฌธ์ํ"ํ๋ ๊ฒฝ์ฐ์๋ง).
const words = ... // some string[] that could be empty
const x = words[0] as string | undefined
console.log(x.length) // TS error
ํํ์ ์๋ ค์ง ๊ธธ์ด์ ์์ ๋ฐฐ์ด์์ ์๋ํฉ๋๋ค. ์ด์ฉ๋ฉด ์ฐ๋ฆฌ๋ ๊ฐ์ ๊ฒ์ ๊ฐ์ง ์ string[5]
๋ฅผ์ํ ์๊ธฐ๋ก [string, string, string, string, string]
?
์ต์
์ผ๋ก ์ด๊ฒ์ ๋งค์ฐ ์ ํธํฉ๋๋ค. ํนํ strictNullChecks
ํ๋๊ทธ๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ ์ ํ ์์คํ
์์ ๋์ ๋๋ ๊ตฌ๋ฉ์
๋๋ค. ์ผ๋ฐ ๊ฐ์ฒด๋ JS์์ ํญ์ ๋งต์ผ๋ก ์ฌ์ฉ๋๋ฏ๋ก TypeScript๋ ํด๋น ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํด์ผ ํฉ๋๋ค.
ํจ์ ๋งค๊ฐ๋ณ์์ ๋ฐฐ์ด ํ๊ดด๋ก ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
function foo([first]: string[]) { /* ... */ }
์ฌ๊ธฐ์ ๋๋ a
๊ฐ string | undefined
์ ํ์ด ๋ ๊ฒ์ผ๋ก ์์ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ์ง ์๋ ํ string
.
function foo([first]: (string | undefined)[]) { /* ... */ }
์ฝ๋ ๊ธฐ๋ฐ์ ๋จ์ผ for
๋ฃจํ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์ด ๋์์ ํ ๊ธํ๊ธฐ ์ํด tsconfig์ ์ปดํ์ผ๋ฌ ์ต์
(์ด๋ฆ strictIndexSignatures
)์ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค. ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ฅผ ์ํด.
์ด๊ฒ์ด ๋ด๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค: https://github.com/danielnixon/total-functions/
์ข์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค. TypeScript ํ์์ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๋ฐ๋๋๋ค.
ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฑ๋ ์ฝ๋์์ ๊ฐ์ ์ ํ๊ณ ์ปดํ์ผ๋ฌ๊ฐ ๊ทธ๊ฒ์ด ์ ์ฅ๋์๋ค๊ณ ์ถ๋ก ํ ์ ์๋ ๊ฒฝ์ฐ IMHO๋ฅผ ์นจ๋ฌต์ํค์ง ์๋ ํ ์ปดํ์ผ๋ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํด์ผ ํฉ๋๋ค.
์ด ๋์์ ์๋ก์ด ์ ํ์ ์ฐ๊ฒฐ ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
Object.entries()
๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ค๋ ์ง๋์ ํจ๊ป | undefined
๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
{[key: string]: string[]}
์ํด ์๋นํ ์ ์ค๋ช
๋ Index ์ ํ์ด ์์ต๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ๋ฌธ์์ด ํค๊ฐ Index์ ํ์๋๋ ๊ฒ์ ์๋๋ผ๋ ๋ช
๋ฐฑํ ๊ฒฝ๊ณ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Index์์ ์กฐํํ ๊ฐ์ ์๋นํ๋ ค๊ณ ํ ๋ TS๊ฐ catchํ์ง ์๋ ๋ฒ๊ทธ๋ฅผ ์์ฑํ์ต๋๋ค. ์ ์๋์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์์์ต๋๋ค.
๊ทธ๋์ ๊ถ์ฅ๋๋ก {[key: string]: string[] | undefined}
๋ก ๋ณ๊ฒฝํ์ง๋ง ์ด์ Object.entries()
์ฌ์ฉ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. TypeScript๋ ์ด์ (์ ํ ์ฌ์์ ๋ฐ๋ผ ํฉ๋ฆฌ์ ์ผ๋ก) ์ธ๋ฑ์ค์ ์ ์๋์ง ์์ ๊ฐ์ด ์ง์ ๋ ํค๊ฐ ์์ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ฏ๋ก Object.entries()
ํธ์ถ ๊ฒฐ๊ณผ์ ์ ์๋์ง ์์ ๊ฐ์ด ํฌํจ๋ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. undefined
๊ฒฐ๊ณผ๋ฅผ ์ป์ด์ผ ํ๋ ์ ์ผํ ์๊ฐ์ ์กด์ฌํ์ง ์๋ ํค๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ฉฐ Object.entries()
์ฌ์ฉํ ๋ ๋์ด๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ TypeScript๋ฅผ ํ๋ณตํ๊ฒ ๋ง๋ค๋ ค๋ฉด ์กด์ฌ ์ด์ ๊ฐ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํด์ผ ํฉ๋๋ค.
@RyanCavanaugh , ์ด์ ๋ํ ๊ทํ์ ์๋ ๋ต๋ณ ์ด ์ฌ์ ํ TS ํ์ ํ์ฌ ์์น๋ผ๊ณ ๊ฐ์ ํฉ๋๊น? ์๋ฌด๋ ์ค๋ ๋๋ฅผ ์ฝ์ง ์๊ณ ๋ ๊ฐ๋ ฅํ JS ์ปฌ๋ ์ ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋ํ ๋ช ๋ ์ ๊ฒฝํ์ด ์๋์ง ํ์ธํ๊ณ , ์ดํ๋ก ์๊ฒฉํจ์ ๋์ด๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ต์ ์ ๋์ ํ๊ธฐ ๋๋ฌธ์ ๋ ๋ค ์ด์ ๋ํ ์ถฉ๋์ ๋๋ค.
(์ฌ์ ํ ๋์๊ฒ ๋ค์ ์ค๋๋ ฅ์ด ์๋ ์์ ๊ฐ ์์ง๋ง ์ด ์ค๋ ๋๋ ์ด๋ฏธ ๋ชจ๋ ์ฃผ์ฅ์ ํ์ผ๋ฉฐ ๋ค๋ฅธ ์๊ฒฌ์ ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝํ์ง ์์ ๊ฒ์ ๋๋ค)
๋๊ตฐ๊ฐ๊ฐ ์์ ์ lib.d.ts๋ฅผ ์์ ํ๊ณ ์์ ์ ์ฝ๋์์ ๋ชจ๋ ๋ค์ด์คํธ๋ฆผ ์ค๋จ์ ์์ ํ๊ณ ์ด๊ฒ์ด ๊ฐ์น ์ ์์ ๊ฐ์ง๊ณ ์์์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ ์ฒด diff๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ณด์ฌ์ฃผ๊ณ ์ถ๋ค๋ฉด ์ฐ๋ฆฌ๋ ํด๋น ๋ฐ์ดํฐ์ ์ด๋ ค ์์ต๋๋ค.
@RyanCavanaugh ๋ค์์ ์ผ๋ถ ๋ฐํ์ ์ถฉ๋์ด ์ ์๊ณ ์๋ ๋ด ์ฝ๋ ๊ธฐ๋ฐ์ ๋ช ๊ฐ์ง ์ฌ๋ก์ ๋๋ค. ์ด ๋๋ฌธ์ ํ๋ก๋์ ์์ ์ถฉ๋์ด ๋ฐ์ํ์ฌ ํซํฝ์ค๋ฅผ ๋ฆด๋ฆฌ์คํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ด๋ฏธ ์์์ต๋๋ค.
src={savedAdsItem.advertImageList.advertImage[0].mainImageUrl || undefined}
return advert.advertImageList.advertImage.length ? advert.advertImageList.advertImage[0].mainImageUrl : ''
birthYear: profileData.birthYear !== null ? profileData.birthYear : allowedYears[0].value,
upsellingsList.upsellingProducts[0].upsellingProducts[0].selected = true
const latitude = parseFloat(coordinates.split(',')[0])
const advert = Object.values(actionToConfirm.selectedItems)[0]
await dispatch(deactivateMyAd(advert))
์ด ๊ฒฝ์ฐ ArticleIDs extends articleNames[]
๊ฐ ๊ฒฐ๊ณผ ๊ฐ์ undefined
๋ฅผ ํฌํจํ๋ฏ๋ก ์ฑ๊ฐ์ ๋ฐ๋ฉด ์์ ํ ์ ์๋ ํ์ ์งํฉ๋ง ํ์ฉํด์ผ ํฉ๋๋ค. ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๊ณ ์น ์ ReadonlyArray<articleNames>
๋์ articleNames[]
.
export enum articleNames {
WEB_AGB = 'web_agb',
TERMS_OF_USE = 'web_terms-of-use',
}
export const getMultipleArticles = async <ArticleIDs extends articleNames[], ArticleMap = { [key in ArticleIDs[number]]: CmsArticle }>(ids: ArticleIDs): Promise<ArticleMap> => {...}
์ ์ฒด์ ์ผ๋ก ๋ฐํ์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด ์ถ๊ฐ ์ ํ ์์ ์ฑ์ ๊ฐ๊ณ ์ถ์ต๋๋ค.
์ด ๋๊ธ #11238 (๋๊ธ) ์์ ์ข ๋ ์ถ๋ก ์ ๋ค์ด๊ฐ์ต๋๋ค.
์ธ์์ ์๋ ๋ ๊ฐ์ง ์ ํ์ ํค๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ์๋ _do_๋ ์ผ๋ถ ๊ฐ์ฒด์ ํด๋น ์์ฑ์ด ์๊ณ (์์ ), _๋ชจ๋ฅด๋ ๊ฒ์ ์ผ๋ถ ๊ฐ์ฒด์ ํด๋น ์์ฑ์ด ์๋ ๊ฒ์ผ๋ก _์๋ ค์ ธ ์์ง ์์ต๋๋ค(์ํ).
๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฐ๋ฅธ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ฒซ ๋ฒ์งธ ์ข ๋ฅ์ ํค์ธ "์์ ํ" ํค๋ฅผ ์ป์ต๋๋ค.
for (let i = 0; i < arr.length; i++) { // arr[i] is T, not T | undefined
๋๋
for (const k of Object.keys(obj)) { // obj[k] is T, not T | undefined
ํค์์ ๋ ๋ฒ์งธ ์ข ๋ฅ์ธ "์ํํ" ์ข ๋ฅ๋ฅผ ์ฌ์ฉ์ ์ ๋ ฅ, ๋์คํฌ์ ์์ JSON ํ์ผ ๋๋ ์กด์ฌํ ์ ์์ง๋ง ์์ ์ ์๋ ์ผ๋ถ ํค ๋ชฉ๋ก์์ ์ป์ต๋๋ค.
๋ฐ๋ผ์ ์ํํ ์ข ๋ฅ์ ํค์ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ๊ธฐ์
| undefined
์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์์ "_์ํํ_ ํค๋ฅผ ์ํํ ๊ฒ์ผ๋ก ์ทจ๊ธ"์ด ์๋๋ผ "_๋ชจ๋ _ ํค, ์ฌ์ง์ด ์์ ํ ํค๋ผ๋ ์ํํ ๊ฒ์ผ๋ก ์ทจ๊ธ"์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ๋จ ์์ ํค๋ฅผ ์ํํ ๊ฒ์ผ๋ก ์ทจ๊ธํ๊ธฐ ์์ํ๋ฉด ์ธ์์ด ์ ๋ง ์๋ง์ด ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.for (let i = 0; i < arr.length; i++) { console.log(arr[i].name);
TypeScript๋
arr[i]
๊ฐundefined
์ผ ์ ์๋ค๊ณ ๋ถํํ๊ณ ์์ต๋๋ค. ์ด์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ต๊ด์ด ์๊ฒผ์ต๋๋ค. ์ด๋ฆฌ์๊ฒ ๋๊ปด์ง๋๋ค.for (let i = 0; i < arr.length; i++) { // TypeScript makes me use ! with my arrays, sad. console.log(arr[i]!.name);
๋๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค.
function doSomething(myObj: T, yourObj: T) { for (const k of Object.keys(myObj)) { console.log(yourObj[k].name); } }
TypeScript๋ "์ด๋ด, ๊ทธ ์ธ๋ฑ์ค ํํ์์
| undefined
์ผ ์ ์์ผ๋ฏ๋ก ์ด ์ค๋ฅ๋ฅผ ์ด๋ฏธ 800๋ฒ ๋ณด์๊ธฐ ๋๋ฌธ์ ์ถฉ์คํ ์์ ํด์ผ ํฉ๋๋ค.function doSomething(myObj: T, yourObj: T) { for (const k of Object.keys(myObj)) { console.log(yourObj[k]!.name); // Shut up TypeScript I know what I'm doing } }
ํ์ง๋ง ๋ฒ๊ทธ๋ฅผ ์์ ํ์ง ์์์ต๋๋ค .
Object.keys(yourObj)
, ๋๋myObj[k]
๋ฅผ ์ฐ๋ ค๊ณ ํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ด๋ค ์๋๋ฆฌ์ค์์๋ ์ค์ ๋ก ๋์์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ต์ ์ ์ปดํ์ผ๋ฌ ์ค๋ฅ์ ๋๋ค. ๋์ผํ ํ์์ ๋ค๋ฅธ ํํ๋ณด๋ค ์ค์ ๋ก ๋ ์ํํ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ชจ๋ ์ข ๋ฅ์ ํํ์ ๋์ผํ ์์์ ์ ์ฉํ ๋ฟ์ ๋๋ค."์ ๋ง ์ด ํ์ผ์ ์ญ์ ํ์๊ฒ ์ต๋๊น?" ๋ํ. ํ์ผ์ ์ญ์ ํ๋ ค๊ณ ํ ๋๋ง๋ค ํด๋น ๋ํ ์์๊ฐ ๋ํ๋๋ฉด
del
๋ฅผ ๋๋ฅด๋ ๋del y
๋ฅผ ๋๋ฅด๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๋นจ๋ฆฌ ๋ฐฐ์ฐ๊ณ ์ค์ํ ํญ๋ชฉ์ ์ญ์ ํ์ง ์์ ํ๋ฅ ์ด ์ฌ์ ์ค์ ์ผ๋ก ์ฌ์ค์ ๋ฉ๋๋ค. -๋ํ ๊ธฐ์ค์ . ํ์ผ์ด ํด์งํต์ผ๋ก ์ด๋ํ์ง ์์ ๋ ํ์ผ์ ์ญ์ ํ ๋๋ง ๋ํ ์์๊ฐ ํ์๋๋ค๋ฉด ์ด์ ์๋ฏธ ์๋ ์์ ์ ํ๋ณดํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ฐ์ฒด ํค๊ฐ ์์ ํ์ง ์ฌ๋ถ๋ฅผ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ "๋น์ ์ด ์ ๋ง๋ก ๊ทธ ๊ฐ์ฒด๋ฅผ ์ธ๋ฑ์ฑํ์๊ฒ ์ต๋๊น?"๋ผ๊ณ ํ์๋ฉ๋๋ค. ํ ๋๋ง๋ค ๋ํ ์์๊ฐ ํ์๋์ง ์๋ ๊ฒ๋ณด๋ค ๋ ๋์ ์๋๋ก ๋ฒ๊ทธ๋ฅผ ์ฐพ์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋๋ ํ์ผ ์ญ์ ๋ํ ์์์ ๋น์ ์ ๋์ํ์ง๋ง ์ด ๋น์ ๋ ์ฌ์ฉ์๊ฐ ์ ์๋์ง ์์๊ฑฐ๋ null์ผ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ์ ๊ฐ์ ๋ก ํ์ธํ๋๋ก ํ์ฅ๋ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์ด ์ค๋ช
์ ์ค์ ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค. ์๋ํ๋ฉด ์ด ์ค๋ช
์ด ์ฌ์ค์ด๋ผ๋ฉด, strictNullChecks
์ต์
์ ๋์ผํ ๋์์ ์ ๋ํ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด document.getElementById
์ฌ์ฉํ์ฌ DOM์์ ์ผ๋ถ ์์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ง์ TypeScript ์ฌ์ฉ์๋ ์ถ์ ํ๊ธฐ ๋งค์ฐ ์ด๋ ค์ด Cannot access property X of undefined
์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๋์ ์ด๋ฌํ ์์ธ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฌํ ์ฝ๋์ ๋ํด ํ๋๊ทธ๋ฅผ ํ์ํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๊ฒฐ๊ตญ์๋ ์ด๋ฌํ ์ข ๋ฅ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ TypeScript ์ปดํ์ผ๋ฌ ์ต์ ์ผ๋ก ๊ตฌํ๋ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ฌ์ฉ์๊ฐ TypeScript๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ดํ๊ณ ์ํํ ์ฝ๋์ ๋ํด ๊ฒฝ๊ณ ํ๊ธฐ๋ฅผ ์ํ๋ ์ด์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ ์ด ๋๋ ๊ฐ์ฒด์ ๋ํ ์ก์ธ์ค๊ฐ ์๋ชป๋์๋ค๋ ์ด์ผ๊ธฐ๋ ๊ฑฐ์ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด ์ฃผ์ฅ์ ๋ท๋ฐ์นจํ ๋ฐ์ดํฐ๊ฐ ์์ต๋๊น? ์๋๋ฉด ๊ทธ๋ฅ ์์์ ์ง๊ฐ์ ๊ทผ๊ฑฐํ ๊ฒ์ ๋๊น?
for (let i = 0; i < arr.length; i++) {
console.log(arr[i].name);
TypeScript์ ์ ์ด ํ๋ฆ ๊ธฐ๋ฐ ์ ํ ๋ถ์์ ์ด ๊ฒฝ์ฐ๊ฐ ์์ ํ๊ณ !
ํ์ํ์ง ์์์ ์ธ์ํ๋๋ก ๊ฐ์ ๋ ์ ์์ต๋๋ค. ์ธ๊ฐ์ด ์์ ํ๋ค๊ณ ์ถ๋ก ํ ์ ์๋ค๋ฉด ์ปดํ์ผ๋ฌ๋ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ปดํ์ผ๋ฌ์์ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํ์ง ์์ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
TypeScript์ ์ ์ด ํ๋ฆ ๊ธฐ๋ฐ ์ ํ ๋ถ์์ ์ด ๊ฒฝ์ฐ๋ฅผ ์์ ํ๋ค๊ณ ์ธ์ํ๋๋ก ๊ฐ์ ๋ ์ ์์ต๋๋ค.
์ ๋ง ํ ์ ์์ต๋๋ค.
declare function someFunc(arr: number[], i: number): void;
let arr = [1, 2, 3, 4];
for (let i = 0; i < arr.length; i++) {
someFunc(arr, arr[i]);
}
์ด ํจ์๋ ๋ฃจํ๋ฅผ ํตํ ๋ ๋ฒ์งธ ํจ์ค์์ undefined
๋ฅผ someFunc
๋ก ์ ๋ฌํฉ๋๊น, ์๋๋ฉด ์ ๋ฌํ์ง ์์ต๋๊น? someFunc
์ธ ์ ์๋ ๋ง์ ๊ฒ๋ค์ด ์์ด ๋์ค์ undefined
ํ์๋ฉ๋๋ค.
์ด๊ฑด ์ด๋?
declare function someFunc(arr: number[], i: number): void;
let arr = [1, 2, 3, 4];
let alias = arr;
for (let i = 0; i < arr.length; i++) {
someFunc(alias, arr[i]);
}
@fabb ๋ค๋ฅธ ์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
```
$ ๋
ธ๋
์์ ์ค๋ฅ = []
์ฐพ์ผ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค
arr[7] = 7
7
์
[ <7๊ฐ์ ๋น ํญ๋ชฉ>, 7 ]
for (let i = 0; i < arr.length; i++) {
... console.log(arr[i])
... }
์ฐพ์ผ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค
์ฐพ์ผ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค
์ฐพ์ผ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค
์ฐพ์ผ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค
์ฐพ์ผ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค
์ฐพ์ผ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค
์ฐพ์ผ์๋ ์ฃผ์๊ฐ ์์ต๋๋ค
7
์ ์๋์ง ์์```
์ด๋ป๊ฒ ์ถ๋ก ์ ๋ํด, ์ฌ๊ธฐ๋ถํฐ @RyanCavanaugh item :: T
์ ๋ํด arr :: T[]
์์ for (const item of arr) ...
, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ถ๋ก arr[i] :: T | undefined
์ผ๋ถ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ --strict-index
? ์ด๋ป๊ฒ ๊ฑฑ์ ํ๋ ๊ฒฝ์ฐ, ์ฝ obj[key] :: V | undefined
์์ง๋ง Object.values(obj) :: V[]
์ ๋ํด obj :: { [key: string]: V }
?
@yawaramin ํฌ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Typescript๋ ์ด๋ฏธ ์ฌ๋ฐ๋ฅธ ์์
์ ์ํํ์ง ์์ต๋๋ค. --strict-index
ํ๋๊ทธ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ปดํ์ผ:
const arr = []
arr[7] = 7
for (let i = 0; i < arr.length; i++) {
console.log(Math.sqrt(arr[i]));
}
@RyanCavanaugh ์ฌ์ฉ์๊ฐ ์ด๋ ์ด์ ์๋ชป ์ก์ธ์คํ๊ธฐ ์ฌ์ด ์์น๋ฅผ ๋ณด์ฌ์ค ์ ์๋ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์๊ฐ ํ๋ ์์ต๋๋ค.
const getBlock = (unitNumber: string): string => unitNumber.split('-')[0]
์์ ์ฝ๋๋ getBlock
์ ์ผ๋ถ ์ฌ์ฉ์ด ์ ์๋์ง ์์(์ getBlock('hello')
)์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ strictNullChecks
์๋์์ ์ปดํ์ผ๋ฌ ๊ฒ์ฌ๋ฅผ ์ ์์ ์ผ๋ก ํต๊ณผํด์๋ ์ ๋ฉ๋๋ค. ๋ด ์์ฉ ํ๋ก๊ทธ๋จ์ ํญ๋ฐ์ํค์ง ์๊ณ ์ ์๋์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ปดํ์ผ๋ฌ์์ ๋ฐ์ ํ๋๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ arr.slice(-1)[0]
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๋ง์ง๋ง ์์์ ์ก์ธ์คํ๊ฑฐ๋ ์ฒซ ๋ฒ์งธ ์์ arr[0]
๋ฑ์ ์ก์ธ์คํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ง์ ์ผ๋ฐ์ ์ธ ๊ด์ฉ๊ตฌ์๋ ์ ์ฉ๋ฉ๋๋ค.
๊ถ๊ทน์ ์ผ๋ก ์ ๋ TypeScript๊ฐ ํญ๋ฐ์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฒ๋ฆฌํ๋ ๊ฒ๋ณด๋ค ๊ทธ๋ฌํ ์ค๋ฅ์ ๋ํด ์ ๋ฅผ ๊ท์ฐฎ๊ฒ ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด ํจ์๋ ๋ฃจํ๋ฅผ ํตํ ๋ ๋ฒ์งธ ํจ์ค์์ ์ ์๋์ง ์์ ๊ฒ์ someFunc์ ์ ๋ฌํฉ๋๊น? ๋ด๊ฐ someFunc์ ์์ฑํ ์ ์๋ ๋ง์ ๊ฒ๋ค์ด ๋์ค์ ์ ์๋์ง ์์ ๊ฒ์ด ๋ํ๋๊ฒ ํ ์ ์์ต๋๋ค.
@RyanCavanaugh ์, JavaScript๋ ๋ถ๋ณ์ฑ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ !
๊ฐ ํ์ํ๊ฑฐ๋ ReadonlyArray
๋ฐฐ์ด someFunc(arr: ReadonlyArray<number>, i: number)
ํฉ๋๋ค.
@yawaramin ํฌ์ ๋ฐฐ์ด์ ๊ฒฝ์ฐ TypeScript๊ฐ ํํ์ฒ๋ผ ์ฌ์ฉ๋๋ค๊ณ ์ถ๋ก ํ ์ ์๋ ๊ฒฝ์ฐ ์์ ์ ํ์ undefined
๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค. @danielnixon์ด ๋งํฌํ ์ฝ๋(https://github.com/microsoft/TypeScript/issues/13778#issuecomment-536248028)์์ ํํ๋ ํน๋ณํ๊ฒ ์ทจ๊ธ๋๋ฉฐ ๋ฐํ๋ ์์ ์ ํ์ undefined
๋ฅผ ํฌํจํ์ง ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ์ค์ ๋ ์ธ๋ฑ์ค๋ง ์ก์ธ์คํ๋๋ก ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด๊ฒ์ ์์์ ์ธ ๊ฒฐ์ ์ ๋๋ค. ์ด ์ฝ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋งค์ฐ ์ฑ๊ฐ์ค ๊ฒ์ ๋๋ค.
var a = []; for (var i =0; i< a.length; i++) { a[i]+=1; // a[i] is possibly undefined }
์ด๋ด, ๋๋ ๊ทธ ๊ตฌ๋ฌธ์ ์๊ณ ์๋ค; ์ ๋ ์ด๋ฐ ๋ฃจํ๋ฅผ 1๋ ์ ํ ๋ฒ ์์ฑํฉ๋๋ค!
์ค์ ๋ก ๋ฐฐ์ด์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ์ํํ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ค์ ๋ก ๋์ค์ undefined
๋ฅผ ํ์ธํ๊ณ ์ถ์ต๋๋ค.
์ด ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒ์ ๋ํ ๋๋ ค์์ ๊ณผ์ฅ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์๋ฅผ ๋ฐ๋ณตํ๋ ค๋ ๊ฒฝ์ฐ for .. of
์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ค ์ด์ ๋ก ์์ ์ธ๋ฑ์ค๊ฐ ํ์ํ ๊ฒฝ์ฐ forEach
ํ๊ฑฐ๋ entries
๋ฐ๋ณตํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ฑ์ค ๊ธฐ๋ฐ for ๋ฃจํ๊ฐ ์ค์ ๋ก ํ์ํ ๊ฒฝ์ฐ๋ ๊ทนํ ๋๋ญ
๋๋ค.
ํ์ ์ ์ง๋ฅผ ์ํ๋ ๋ ๋์ ์ด์ ๊ฐ ์๋ค๋ฉด ๋ณด๊ณ ์ถ์ง๋ง ๊ด๊ณ ์์ด: ์ด๊ฒ์ ์์คํ ์ ๋ถ์ผ์น์ด๋ฉฐ ์์ ํ๋๊ทธ๊ฐ ์์ผ๋ฉด ๋ง์ ์ฌ๋๋ค์ด ๋์ด ํ๊ฐํ ๊ฒ ๊ฐ์ต๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ, ์ ๋ ์ฌ๊ธฐ์ ํ ๋ก ์ ๋ง์ ๋ถ๋ถ์ด
๊ฐ์ก๋ค. ํจํค์ง ์์ ์๋ ์์ ์ ์ถ๋ก ๊ณผ
์ด๋ฏธ ์ด๋ฌํ ์ฃผ์ฅ์ ๋๋ถ๋ถ์ ๊ณ ๋ คํ์ต๋๋ค. ๊ทธ๋ค์ด ํด๊ฒฐํ ๊ณํ์ด๋ผ๋ฉด
๋๋ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ์๋ฆด ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ๊ทธ ์ธ์๋ ์๊ฐํ์ง ์๋๋ค.
์ค๋ ๋๋ ์ ๋ง ์์ฐ์ ์
๋๋ค.
2019๋ 10์ 25์ผ ๊ธ์์ผ ์ค์ 11์ 59๋ถ brunnerh [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
์ด๊ฒ์ ์์์ ์ธ ๊ฒฐ์ ์ ๋๋ค. ์ด ์ฝ๋๊ฐ
์ค๋ฅ๊ฐ ๋๋ค:var a = [];for (var i =0; i< a.length; i++) {
a[i]+=1; // a[i]๋ ์ ์๋์ง ์์์ ์ ์์ต๋๋ค.
}์ด๋ด, ๋๋ ๊ทธ ๊ตฌ๋ฌธ์ ์๊ณ ์๋ค; ์ ๋ ์ด๋ฐ ๋ฃจํ๋ฅผ 1๋ ์ ํ ๋ฒ ์์ฑํฉ๋๋ค!
์ค์ ๋ก ๋ฐฐ์ด์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ์ํํ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋
์ค์ ๋ก ๋์ค์ undefined๋ฅผ ํ์ธํ๊ณ ์ถ์ต๋๋ค.์ด ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒ์ ๋ํ ๋๋ ค์์ ๊ณผ์ฅ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์์ ๋ํด ๋ฐ๋ณตํ๋ ค๋ ๊ฒฝ์ฐ .. of์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ง์ฝ์
์ด๋ค ์ด์ ๋ก ์์ ์ธ๋ฑ์ค๊ฐ ํ์ํ๋ฉด forEach๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ฐ๋ณตํ์ญ์์ค.
ํญ๋ชฉ. ์ผ๋ฐ์ ์ผ๋ก ์ ๋ง ํ์ํ ๊ฒฝ์ฐ๋ ๊ทนํ ๋๋ญ ๋๋ค.
์ธ๋ฑ์ค ๊ธฐ๋ฐ for ๋ฃจํ.ํ์ ์ ์ง๋ฅผ ์ํ๋ ๋ ๋์ ์ด์ ๊ฐ ์๋ค๋ฉด
๋ณด๊ณ ์ถ์ง๋ง ๊ด๊ณ์์ด : ์ด๊ฒ์ ์์คํ ์ ๋ถ์ผ์น์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๊ณ ์น ๊น๋ฐ์ด ์์ผ๋ฉด ๋ง์ ์ฌ๋๋ค์ด ๋์ด ํ๊ฐํ ๊ฒ ๊ฐ์ต๋๋ค.โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/microsoft/TypeScript/issues/13778?email_source=notifications&email_token=ACAJU3DQ7U6Y3MUUM26J4JDQQM62XA5CNFSM4C6KEKAKY45CNFSM4C6KEKAKYYY3PNVWWK3TUL52HS4DFVEXG43NVMVBW6
๋๋ ๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/ACAJU3EWVM3CUFG25UF5PGDQQM62XANCNFSM4C6KEKAA
.
ํจํค์ง ์์ ์์ ์์ง์์ด ์์ ์๋ ์์ง๋ง ์ปค๋ฎค๋ํฐ์ ์ง์์ ์ธ ํผ๋๋ฐฑ์ ์ฌ์ ํ โโ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ๋ ๋์ ๋๊ตฌ์ ๋ํ ์๊ตฌ๊ฐ ์ฌ์ ํ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
@brunnerh ๋์ํฉ๋๋ค. ์์ฆ์ ์ฑ๋ฅ ํ๋์ ์ํ ๊ฒ์ด ์๋๋ฉด for
๋ฃจํ๋ฅผ ์ฌ์ฉํ ํ์์กฐ์ฐจ ์์ต๋๋ค. ์ด๋ ๋๋ถ๋ถ์ ์๊ฐ ๋งต์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ํ์ฌ ์ฝ๋๋ฒ ์ด์ค์์ 0%์ ์๊ฐ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. /filter/reduce to for ๋ฃจํ๋ ์ฑ๋ฅ์ ๊ฑฐ์ ํฅ์์ํค์ง ์์ผ๋ฉฐ ์ค์ ์์ธ์ ํญ์ ๋นํจ์จ์ ์ธ ๋
ผ๋ฆฌ, ๋คํธ์ํฌ ๋ฌธ์ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์์ต๋๋ค.
์์ง ์๋ฌด๋ as const
๋ํด ์ด์ผ๊ธฐํ์ง ์์๋ค๋ ์ฌ์ค์ด ๋๋์ต๋๋ค.
const test = [1, 2, 3] as const;
(test[100]).toFixed(5);
// Tuple type 'readonly [1, 2, 3]' of length '3' has no element at index '100'.
๋ ์ผ๋ฐ์ ์ผ๋ก, ์ด ๋ฌธ์ ์ ์ด๊ธฐ ๋ฉ์์ง์ ์ ํํ ๊ด๋ จ์ด ์๋ ์ ๋ ์ง๋ ๋ช ๋ฌ ๋์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์ด ํ๋ก๊ทธ๋๋ฐ ํจํด์ ์ฌ์ฉํด ์์ผ๋ฉฐ ์ ์๋ํ์ต๋๋ค.
const xs: Array<number | undefined> = [1,2,3];
// for objects but kind of related as well
Record<string, User | undefined>
interface Something {
[key: string]: User | undefined
}
๋น๋ก ?
์ฒ๋ผ ์งง์ ํ๊ธฐ๋ฒ์ ์์ง๋ง ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ด ์ ์๋์ด ์๋์ง ํ์คํ์ง ์์ ์ ์๋ค๊ณ ์ปดํ์ผ๋ฌ์๊ฒ ๋งํ๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค.
@martpie as const
์ธ ์๋ง ์๋ค๋ฉด ์ ๋ง ์ข์ต๋๋ค.
Array<T | undefined>
์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ์ ์ด๋ ๋ ๊ฐ์ง์
๋๋ค.
undefined
๋ฅผ ์์ ์ธ์๋ก ์ ๋ฌํ์ง ์๋ forEach
, map
๋ฐ filter
์ ์๋ช
์ ๋ณ๊ฒฝํฉ๋๋ค(ํด๋น ์ธ๋ฑ์ค๊ฐ ๋ช
์์ ์ผ๋ก ๊ทธ๋ ๊ฒ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ). ๊ทธ ๊ธฐ๋ฅ์ ์ผ๋ง๋ ์ฌ์ฉํ๋๋์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๊ธฐ ๊ท์ฐฎ์ ์ ์์ต๋๋ค.๋๋ ๋ํ ์ด๊ฒ์ด eslint/typescript์์ ๋ง์ ์คํ์ ์ ๋ฐํ๋ค๋ ์ ์์ ์ฐจ์ํ๊ณ ์ถ์ต๋๋ค.
const a: string[] = [];
const foo = a[1000];
if (foo) { // eslint says this is an unnecessary conditional
console.log(foo.length);
}
Eslint๋ foo๊ฐ ๊ฒฐ์ฝ null์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋ถํ์ํ ๊ฒ์ฌ๋ผ๊ณ ์ ํ์์ ์ถ๋ก ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ ๋ฐฐ์ด์์ ๋ฐํ๋ ํญ๋ชฉ์ ๋ํด null ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๊ฒ์ ์์์ ์ผ๋ก ๊ธฐ์ตํด์ผ ํ ๋ฟ๋ง ์๋๋ผ eslint ๋นํ์ฑํ ๋ผ์ธ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ๊ฐ์ for ๋ฃจํ ์ธ๋ถ์ ์ก์ธ์คํ๋ ๊ฒ์ด ์ฌ์ค์ ๋ฐฐ์ด ์ก์ธ์ค๋ฅผ ์ํํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋๋ค. (์์ฆ ๋๋ถ๋ถ์ TS ๊ฐ๋ฐ์์ฒ๋ผ) ๋ฐฐ์ด์ ๋ฐ๋ณตํ ๋ forEach/map/filter/etc ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
strict
๊ฐ true์ด๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก true๋ก ์ค์ ๋๋ ์ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๊ฐ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋๋ค์ด ์ด๋ฅผ ์ข์ํ์ง ์์ผ๋ฉด ์ตํธ์์ํ ์ ์์ต๋๋ค. ์ด์จ๋ ์ต์ ๋ฒ์ ์ ์๋ก์ด ์๊ฒฉํ ์ปดํ์ผ๋ฌ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ ์ต๊ทผ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณธ ์ ํ ์์คํ ์ ์ค๋ฅ์ธ _only_ ๋ฐํ์ ์ ํ ๋ฒ๊ทธ์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ ์์ค์ ๋๋ค.
ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์ ํ์ ์ฐ๊ฒฐ ์ฐ์ฐ์์ ์ธ์ฒด ๊ณตํ์ ๊ณ ๋ คํ ๋ ํ๋๊ทธ๋ฅผ ํตํด ์ด ๋์์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํ์ง _ํ์ง_ ์๊ธฐ๋ก ํ ๊ฒฐ์ ์ ๋ค์ ๊ฒํ ํด์ผ ํ ๋์ ๋๊น?
์๋ฒ์์ Thing
๋ฐฐ์ด์ ๊ฐ์ ธ์ค๊ณ ๋ฐฐ์ด์ ๋ง์ง๋ง Thing
์ ํ์ํด์ผ ํ๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ ๋ฐฐ์ด์ด ์ค์ ๋ก ๋น์ด ์๊ณ ์์ฑ์ ์ก์ธ์คํ๋ค๋ ๊ฒ์
๋๋ค. Thing
์์ ์ฑ์ด ์ถฉ๋ํฉ๋๋ค.
์์:
// `things` is `Thing[]`, but is empty, i.e., `[]`
const { things } = data;
// We are accessing `things[-1]`, which is obviously `undefined`,
// but TypeScript thinks `latestThing` is a `Thing`
const latestThing = things[things.length - 1];
// TypeError: Cannot read property 'foo' of undefined
return latestThing.foo;
์ด๊ฒ์ API ์ค๊ณ์ ๋ฌธ์ ์ผ ์๋ ์์ง๋ง TS๋ ๋ฐฐ์ด์ ์๋ ๋ฌด์ธ๊ฐ์ ์ก์ธ์คํ ๋ ์ค์ ๋ก ์กด์ฌํ์ง ์์ ์ ์๋ค๋ ์ ์ ์ดํดํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
ํธ์ง: "๋ด๊ฐ ์์ ์ค์ธ ํ์์ ๋ง๋ API"์์์ ๊ฐ์ด "์ฐ๋ฆฌ API"๋ฅผ ์๋ฏธํ์์ ๋ช ํํ ํ๊ณ ์ถ์ต๋๋ค
์, ๋ชจ๋๊ฐ TS๊ฐ ์์ ํ ์์ ํ์ง ์์ ๋จผ ์๊ฐ์ ํ๋์ ์ธ ๋งค์ฐ ๋์ ๋์์ธ ๊ฒฐ์ ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์์ ๋ํฐ ํต์ ์ฌ์ฉํฉ๋๋ค. package.json
๊ฐ๋จํ ์ค์น ํ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
{
...
"scripts": {
"postinstall": "sed -i 's/\\[n: number\\]: T;/[n: number]: T | undefined;/g' node_modules/typescript/lib/lib.es5.d.ts",
...
},
...
}
๋ฌผ๋ก Windows์์๋ ์๋ํ์ง ์์ง๋ง ์๋ ๊ฒ๋ณด๋ค๋ ๋ซ์ต๋๋ค.
์ด ๋ฌธ์ ์ ์ธ์ ํ์ฌ ์คํ๋๋ ๋ค๋ฅธ ๋ชจ๋ ๋ฌธ์ ๋ ์ฌ๊ธฐ๋ก ๋ฆฌ๋๋ ์
๋๋ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ์ฌ๊ธฐ๊ฐ ๊ฐ์ฅ ์ข์ ์ง๋ฌธ์ด๋ผ๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. ํ
์ด๋ธ์์ ์ ํ์ ์ธ๋ฑ์ค ์๋ช
์ ๋ํ ์ถ์ฝ ๊ตฌ๋ฌธ์
๋๊น? @martpie๊ฐ ์ง์ ํ๋ฏ์ด interface Foo { [k: string]?: Bar; }
๋ณด๋ค ์ธ์ฒด๊ณตํ์ ์ด์ง ์์ interface Foo { [k: string]: Bar | undefined; }
์ ์์ฑํด์ผ ํฉ๋๋ค.
?:
๊ตํ์ ์ง์์ ๋ฐ์ ์ ์์ต๋๊น? ๊ทธ๋ ์ง ์๋ค๋ฉด ๊ทธ ์ด์ ๋ ๋ฌด์์
๋๊น? ์ฆ, ๋จ์ผ ์์ฑ ์ ์๋ฅผ ์ํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ์ ์ธ์ฒด๊ณตํ์ ์ด์ ์ด ์ถฉ๋ถํ์ต๋๋ค. ์ธ๋ฑ์ค ์๋ช
์ "์ถฉ๋ถํ ๋์์ด ๋์ง ์์ต๋๊น?"
type Foo = { [_ in string]?: Bar }
๋ ์๋ํฉ๋๋ค. ์์์ง๋ ์์ง๋ง ์๋นํ ๊ฐ๊ฒฐํฉ๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ์์ ๋ง์ Dict
์ ํ์ ๋ง๋ค ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ?:
ํ์ฅ์ ๋ํด ๋
ผ์ํ์ง ์์ ๊ฒ์
๋๋ค.
์ด๊ฒ์ "Javascript: Bad Parts" ์ด์ผ๊ธฐ ์ค ํ๋์ฒ๋ผ ๋๊ปด์ง๊ธฐ ์์ํ์ต๋๋ค.
ts
type Foo1 = { [_ in string]?: Bar } // Yup
type Foo2 = { [_: string]?: Bar } // Nope
interface Foo3 { k?: Bar } // Yup
interface Foo4 { [_: string]?: Bar } // Nope
์ ํ ์๋ช
์ T | undefined
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ค์ ๋ก ์ ์ฉํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ์ธ๋ฑ์ค ์ฐ์ฐ์ ์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค [n]
์ด T|undefined
์ฌ์ฉ ์ ํํ์ง๋ง, ์๋ฅผ ๋ค์ด map
๋ฐฐ์ด์ ์ฐ๋ฆฌ์๊ฒ์ฃผ์งํด์ผ T|undefined
๊ทธ ์ํฉ์์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ด ์กด์ฌํ๋ค๋ ๊ฒ์ ์์์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
@radix Array์ ์ค์ ํจ์์ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ์ ํ์ ์ถ๋ ฅํ๋ ๊ณ ์ ํ ์ ํ ์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์: map
: https://github.com/microsoft /TypeScript/blob/master/lib/lib.es5.d.ts#L1331
| undefined
๊ตฌ์กฐ๊ฐ ์ค์ ๊ฒฝํ ํ๊ท๋ฅผ ๋ํ๋ด๋ ์ ์ผํ ์ผ๋ฐ์ ์ธ ์ฝ๋ ์ฌ์ฉ๋ฒ์ for ... of
๋ฃจํ์
๋๋ค. ๋ถํํ๋ (์ด ๋ฌธ์ ์ ๊ด์ ์์) ๊ทธ๊ฒ๋ค์ ๋ค์ ์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ์
๋๋ค.
@riggs interface Array<T> { }
๊ฐ [index: number]: T | undefined
๊ฐ ๋๋๋ก ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง๋ง @radix ๋ ํ์ฌ ๊ถ์ฅ ์ฌํญ์ผ๋ก ๋ณด์ด๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Array<T | undefined>
์์ ์ ์ฝ๋.
ํ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์ข์ง ์์ต๋๋ค. ๊ทธ ์ค ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ค๋ฅธ ํจํค์ง์ ์ ํ์ ์ ์ดํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ ์์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฆ, undefined
๋ฅผ ์ด๋ ์ด์ ํ ๋นํ ์ ์๊ณ ์์ ํ ๊ฒฝ์ฐ๋ก ์๋ ค์ง ๊ฒฝ์ฐ์๋ undefined
๋ฅผ ์ ๊ณตํฉ๋๋ค. ๐คทโโ๏ธ
์, ๋ค, ์ ์คํด์
๋๋ค. ๋๋ ์ค์ ๋ก [index: number]: T | undefined
์ ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด์๋ง ์ธ๊ธํ์ต๋๋ค. ์ ํ์ Array<T | undefined>
๋ก ์ ์ํ๋ ๊ฒ์ ํด๊ฒฐํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๋์ฐํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ผ๋ ๋ฐ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
lib.es5.d.ts
๋ฅผ ์ฌ์ ์ํ๋ ์ฐ์ํ ๋ฐฉ๋ฒ์ด ์์ต๋๊น ์๋๋ฉด ์ฌํ ์ค์น ์คํฌ๋ฆฝํธ๊ฐ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์
๋๊น?
@ ์ ์์ ์คํ์ ์ค-chiciuc https://www.npmjs.com/package/patch-package ์์ ํ ํจ๊ป ์ด๋จ์ ๋๊ตฌ ์์์ ๋ง๋ https://www.npmjs.com/package/yalc โ๏ธ
lib.es5.d.ts๋ฅผ ์ฌ์ ์ํ๋ ์ฐ์ํ ๋ฐฉ๋ฒ์ด ์์ต๋๊น ์๋๋ฉด ์ฌํ ์ค์น ์คํฌ๋ฆฝํธ๊ฐ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋๊น?
์ฐ๋ฆฌ ํ๋ก์ ํธ์๋ 1) typescript์ ๊ธฐ๋ณธ ์ ํ ์ ์์ ์์ง ํฌํจ๋์ง ์์ ๋ด์ฅ API์ ๋ํ ์ ํ ์ ์๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉํ๋ global.d.ts
ํ์ผ์ด ์์ต๋๋ค(์: ๋ธ๋ผ์ฐ์ ๊ฐ์ ์ง์์ ์ผ๋ก ๋ณ๊ฒฝ๋๊ณ ์ผ๊ด์ฑ์ด ์๋ WebRTC ๊ด๋ จ API). ) ๋ฐ 2) ํ์ดํ ๋ผ์ดํฐ์ ๊ธฐ๋ณธ ์ ํ ์ ์์ ์ผ๋ถ๋ฅผ ์ค๋ฒ๋ผ์ด๋ (์ : ์ ํ ์ค๋ฒ๋ผ์ด๋ (override) Object.entries
๊ฐ ํฌํจ ๋ ๋ฐฐ์ด์ ๋ฐํํ๋๋ก unknown
๋์ any
).
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด typescript์ ๋ฐฐ์ด ์ ํ์ ์ฌ์ ์ํ ์ ์๋์ง ํ์คํ์ง ์์ง๋ง ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์์ ๋ด์ฉ์ ์ ์ธ ๋ณํฉ์ด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ ๋ ์๋ํ์ง๋ง ๋จ์ํํ๊ธฐ ์ํด ์ธํฐํ์ด์ค์ ๊ต์ฐจํ์ง๋ง ์ฌ๊ธฐ์๋ ๋ ์ ํ์ ์ธ ์ต์ ์ด ์ํ๋ ๊ฒ์ ๋๋ค.
๋์ tsconfig.json
์ files
๋๋ include
ํฌํจ๋ ํ๋ก์ ํธ์ ์ฌ์ฉ ์ค์ธ ๋ชจ๋ lib.*.d.ts
ํ์ผ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ ๋ค์ ํธ์งํ ์ ์์ต๋๋ค. ๋น์ ์ด ์ํ๋ ๊ฒ. /// <reference no-default-lib="true"/>
ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ง๋ฒ์ ํ์ํ์ง ์์ง๋ง /// <reference lib="..."/>
์ข
์์ฑ์ ์ ๊ฑฐํด์ผ ํ๋์ง ํ์คํ์ง ์์ต๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ๋ชจ๋ ๋ช
๋ฐฑํ ์ ์ง ๊ด๋ฆฌ์์ ์ด์ ๋ก ์ข์ง ์์ต๋๋ค.
@butchler ์ฐ๋ฆฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์ง๋ง ์ธ๋ฑ์ฑ ์ฐ์ฐ์๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. ๋ค๋ฅธ Array ํจ์( filter
์ ํ ๊ฐ๋ ํฌํจ)๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ ์ํ์ง๋ง.
์ธ๋ฑ์ฑ ์ฐ์ฐ์๋ฅผ ์ฌ์ ์ํ๋ ์ด์ํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
function test() {
const arr: string[] = [];
const [first] = arr;
const zero = arr[0];
const str1: string = first;
const str2: string = zero;
}
๋ ๋ฒ์งธ ํ ๋น์ (๋น์ฐํ ๋๋ก) ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง๋ง ์ฒซ ๋ฒ์งธ ํ ๋น์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๋ ์ด์ํ ๊ฒ์ first
์๋ก ๋ง์ฐ์ค๋ฅผ ๊ฐ์ ธ๊ฐ๋ฉด ๊ตฌ์กฐํ๋์ง ์๊ณ string | undefined
์ ํ์ด ์์ง๋ง ํ ๋น๋๋ ๋์ ๋ง์ฐ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ฉด string
์ ํ์ด ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค
๋ฐฐ์ด ๊ตฌ์กฐํ์ ๋ํ ๋ค๋ฅธ ์ ํ ์ ์๊ฐ ์์ต๋๊น?
๋๋ฝ๋ ์ธ๋ฑ์ค์ ๊ด๋ จ๋ ์ค๋ฅ๊ฐ ๋ด ์ฝ๋์์ ๋ฒ๊ทธ์ ๋น๋ฒํ ์์ธ์ด์๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํ ์๋ฃจ์ ์ ์ฐพ๊ณ ์์ต๋๋ค.
{ [index: string]: string | undefined }
์ ๊ฐ์ ์ ํ์ ์ง์ ํ๋ ๊ฒ์ ํด๊ฒฐ์ฑ
์ด ์๋๋๋ค. undefined
๊ฐ์ ํฌํจํ์ง ์๋ Object.values(x).forEach(...)
์ ๊ฐ์ ๋ฐ๋ณต์์ ๋ํ ์
๋ ฅ์ ์๋ง์ผ๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์
๋๋ค.
someObject[someKey]
์ํํ ํ undefined ๋ฅผ ํ์ธํ์ง ์์ ๋ TypeScript์์ ์ค๋ฅ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ง๋ง Object.values(someObject).forEach(...)
์ํํ ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
@tobico https://github.com/microsoft/TypeScript/issues/13778#issuecomment -536248028
@danielnixon ๊ทธ๊ฒ์ ํด๊ฒฐ์ฑ ์ด ์๋๋ผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค. ๋น์ ์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ ๋ชฉํ๋ฅผ ์ํด ์ธ์ด์ ๋ด์ฅ ๋๊ตฌ๋ฅผ ์ค์๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์ ์๋ ์์ต๋๋ค. ๋ด ๋ง์, ์ด ๋ฌธ์ ์ fp-ts๋ฅผ ์ฌ์ฉํ์ง๋ง ์ด ๋ฌธ์ ๋ ์ฌ์ ํ ์ ํจํ๋ฉฐ ์์ ์ด ํ์ํฉ๋๋ค.
@RyanCavanaugh ์ ๋ฐ๋ ์ฃผ์ฅ ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
for (let i = 0; i < arr.length; i++) {
// TypeScript makes me use ! with my arrays, sad.
console.log(arr[i]!.name);
๋๋ ๊ทธ๊ฒ์ ๋ํด ๋ช ๊ฐ์ง ์งง์ ์๊ฐ์ ํ ๊ฒ์ ๋๋ค. ํต์ฌ์ ์ผ๋ก TypeScript๋ ๊ฐ๋ฐ์ ๋ ์์ ํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. TypeScript ์ ์ฒซ ๋ฒ์งธ ๋ชฉํ ๋ฅผ ๊ธฐ์ตํ๋ ค๋ฉด:
1. ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ตฌ์ฑ์ ์ ์ ์ผ๋ก ์๋ณํฉ๋๋ค.
์ปดํ์ผ๋ฌ๋ฅผ ๋ณด๋ฉด ์ด๋ฏธ ์ ํ ์ถ๋ก ๋ค์ ๋ช ๊ฐ์ง ๋ง๋ฒ์ด ์์ต๋๋ค. ํน๋ณํ ๊ฒฝ์ฐ์ ์ง์ ํ ๋ณ๋ช ์ "์ฐ๋ฆฌ๋ ์ด ๊ตฌ์กฐ์ ๋ํด ์ฌ๋ฐ๋ฅธ ์ ํ์ ์ถ๋ก ํ ์ ์์ต๋๋ค"์ด๊ณ ์์ ํ ๊ด์ฐฎ์ต๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ปดํ์ผ์ด ์ ํ์ ์ ์ถํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์ ์ ์ค์ด๋ญ๋๋ค. ๋ค์ ๋งํด์, ๋์๊ฒ ๋ ์ ๊ตํ ์ ํ ์ ์ถ๋ฅผ ์ป๋ ๊ฒ์ ์๊ฐ ๋ฌธ์ ์ ๋๋ค.
๊ธฐ์ ์ ๊ด์ ์์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ:
const x = ['a', 'b', 'c']
console.log(x[3]) // type: string, reality: undefined
TypeScript์ ์ฒซ ๋ฒ์งธ ๋ชฉํ๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ TypeScript๊ฐ ๋ ์ ํํ ์ ํ์ ์๊ณ ์๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
const x = ['a', 'b', 'c'] as const
console.log(x[3]) // compile error: Tuple type 'readonly ["a", "b", "c"]' of length '3' has no element at index '3'.ts(2493)
์ค์ฉ์ ์ธ ๊ด์ ์์ ๋ณด๋ฉด yet
์ ์ถฉ์์
๋๋ค. ์ด ๋ฌธ์ ์ ์ฌ๋ฌ ๋ซํ ๋ฌธ์ ๋ ์ด ๋ณ๊ฒฝ์ ๋ํ ์ปค๋ฎค๋ํฐ์ ๋์ ์๊ตฌ๊ฐ ์์์ ๋ณด์ฌ์ค๋๋ค. ATM 238๊ฐ ์ฐฌ์ฑ ๋ ๋ฐ๋ 2๋ช
. ๋ฌผ๋ก ์์ for ๋ฃจํ๊ฐ "์ฌ๋ฐ๋ฅธ" ์ ํ์ ์ถ๋ก ํ์ง ์๋ ๊ฒ์ ์ ๊ฐ์ด์ง๋ง ๊ธ์์, ๋๋ถ๋ถ์ ์ง์ง์๋ค์ !
๋ฐ ์๋ก์ด ?
๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ ์์ ํ ๊ฒฝ์ฐ์ ๊ฐ์ ๋ก ์ฌ์ฉํ์ญ์์ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ชฝ์์๋ "์ํํ" ์ก์ธ์ค์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ ํ์ ์ป์ต๋๋ค.
ํฐ ์ฝ๋ ๊ธฐ๋ฐ์ ๋ํ ๋งค์ฐ ๋ฏผ๊ฐํ ๋ณ๊ฒฝ์ด๋ผ๋ ๋ฐ ๋์ํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๊ตฌ์ฑ ์์ฑ์ ํฌํํฉ๋๋ค. ์ ์ด๋ ์ปค๋ฎค๋ํฐ๋ก๋ถํฐ ํผ๋๋ฐฑ์ ๋ฐ๊ธฐ ์ํด์๋. ๊ทธ๊ฒ์ด ๊ฐ๋ฅํ์ง ์๋ค๋ฉด TS 4.0์ด ๊ทธ๊ฒ์ ์ป์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ ์๋ ์๋ฃจ์
์ด ์๋๋ผ ์คํ์ผ ๋ฟ์
๋๋ค. TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด ํ๋ก์ ํธ์์ node_modules
๋ด๋ถ์ lib.es5.d.ts
์์ ํ์ฌ ์ปดํ์ผ๋ฌ๋ฅผ _did_ ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ์ง ํ์ธํ์ต๋๋ค. ์ด์ ๋ํ ์ต์
์
๋๋ค. Array
๋ฐ ReadonlyArray
.
interface ReadonlyArray<T> {
...
[n: number]: T | undefined; // was just T
}
interface Array<T> {
...
[n: number]: T | undefined; // was just T
}
์ด๊ฒ์ ๋งค์ฐ ํฐ ํ๋ก์ ํธ์ด๊ธฐ ๋๋ฌธ์ ์๋ฐฑ ๊ฐ์ง ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋๋ ์ด๋ค ์ข ๋ฅ์ ๋ฌธ์ ์ ๋ถ๋ชํ ๊ฒ์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์ด์ ๋ํ ์ปดํ์ผ๋ฌ ์ต์ ์ด ์๋ค๋ฉด ํด๊ฒฐํ๊ธฐ๊ฐ ์ผ๋ง๋ ์ด๋ ค์ด์ง์ ๋ํ ์์ด๋์ด๋ฅผ ์ป๊ธฐ ์ํด ๊ทธ ์ค ๋ช ๊ฐ์ง๋ง ์ดํด๋ณด์์ต๋๋ค. ๋ค์์ ๋ด๊ฐ ๊ฒช์ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ๋๋ค.
์ด๋ก ์ธํด ์ฝ๋๋ฒ ์ด์ค๋ฟ๋ง ์๋๋ผ ์ข ์์ฑ ์ค ํ๋์ธ io-ts์์๋ ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. io-ts๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ ์ฝ๋์์ ์ฌ์ฉํ๋ ์ ํ์ ์์ฑํ ์ ์์ผ๋ฏ๋ก ์ด ์ต์ ์ ์์ ์ ์ฝ๋๋ฒ ์ด์ค์๋ง ์ ์ฉํ๊ณ io-ts์ ์ ํ์๋ ์ ์ฉํ์ง ์๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ io-ts ๋ฐ ์๋ง๋ ๋ค๋ฅธ ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ปดํ์ผ๋ฌ ์ต์ ์ผ๋ก๋ง ๋์ ๋ ๊ฒฝ์ฐ์๋ ์ด ์ต์ ๊ณผ ํจ๊ป ์๋ํ๋๋ก ์ ๋ฐ์ดํธํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฒ์์๋ ์ด๊ฒ์ ์ปดํ์ผ๋ฌ ์ต์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋ ผ๋์ ๋ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ต์ ์ ์ฌ์ฉํ๊ธฐ๋ก ์ ํํ ์ฌ๋๋ค์ด ์ฌ๋ฌ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์์๊ฒ ๋นํธํ์ฑ์ ๋ํด ๋ถํํ๊ธฐ ์์ํ๋ฉด ๋จ์ํ TS 4.0์ด ๋๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ ผ์์ ์ฌ์ง๊ฐ ์์ ์ ์์ต๋๋ค. ๊นจ๋ ๋ณํ.
๋๋ก๋ ์ ์๋์ง ์์ ๊ฐ๋ฅ์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ถ๊ฐ ์ ํ ๊ฐ๋๋ฅผ ์ถ๊ฐํด์ผ ํ์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋์ ๋์ ๊ฒ์ ์๋๋ฉฐ ์ด ์ ์์ ์์ ์ด๊ธฐ๋ ํ์ง๋ง ์์ ์ฑ์ ์ํด ์ธ๊ธํ ๊ฒ์ ๋๋ค.
์์์ Array<T>
๋ฐ๋ณตํ๋ for (let i = 0; i < array.length; i++)
๋ฃจํ ๋ด๋ถ์ ์ ํ ์ค๋ฅ๊ฐ ์์ต๋๋ค. T
์์ฒด์ undefined
๊ฐ ํฌํจ๋ ์ ์๊ธฐ ๋๋ฌธ์ T
undefined
๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ ํ ๊ฐ๋๋ฅผ ์ถ๊ฐํ ์ ์์์ต๋๋ค. ๋ด๊ฐ ์๊ฐํ ์ ์๋ ์ ์ผํ ํด๊ฒฐ์ฑ
์ A) ์ ํ ์ด์ค์
๋๋ @ts-ignore
๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ ์ค๋ฅ๋ฅผ ์นจ๋ฌต์ํค๊ฑฐ๋ B) ๋์ for-of ๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋๋ ์ด๊ฒ์ด ๋๋ฌด ๋์๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง(์ด์จ๋ ๋ฐฐ์ด์ ๋ฐ๋ณตํ๊ธฐ ์ํด for-of ๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ง ์์ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ ๊ฒ์
๋๋ค), ๋
ผ๋์ ์ฌ์ง๊ฐ ์์ต๋๋ค.
๊ธฐ์กด ์ฝ๋๊ฐ ์ด๋ฏธ .length
๊ฐ์ ๋ํด ์ผ๋ถ ์ฃผ์ฅ์ ํ ๋ค์ ๋ฐฐ์ด์ ์์์ ์ก์ธ์คํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด์ .length
๊ฒ์ฌ์๋ ๋ถ๊ตฌํ๊ณ ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฏ๋ก .length
๊ฒ์ฌ์ ์์กดํ์ง ์๋๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ค๋ณต !== undefined
๊ฒ์ฌ๋ฅผ ์ถ๊ฐํด์ผ ํ์ต๋๋ค. ํ์ดํ ๋ผ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๋ ์ฌ์ฉ์ ํ์ฉ ํ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ด๋ค .length
์ ํ์์ฑ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ธ !== undefined
ํ์ธ. ๋๋ ๊ทธ๊ฒ์ ์ค์ ๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ฌ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
์ผ๋ถ ์ฝ๋๋ A[number]
๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ๋ฐฐ์ด ์ ํ์ ์์ ์ ํ์ ๊ฐ์ ธ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ด์ T
๋์ T | undefined
๋ฅผ ๋ฐํํ์ฌ ๋ค๋ฅธ ๊ณณ์์ ์ ํ ์ค๋ฅ๋ฅผ ์ผ์ผํต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์ฐ๋ฏธ๋ฅผ ๋ง๋ค์์ต๋๋ค.
type ArrayValueType<A extends { [n: number]: unknown }> = (
A extends Array<infer T> ? T :
A extends ReadonlyArray<infer T> ? T :
A[number] // Fall back to old way of getting array element type
);
๊ทธ๋ฌ๋ ์ ํ์ ์ฝ๊ฒ ํด์ฃผ๋ ์ด ๋์ฐ๋ฏธ๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์ด๋ ์ฌ์ ํ ํฐ ๋ณํ์
๋๋ค. ์๋ง๋ TypeScript๋ ์ด ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด A[number]
์ ๋ํ ์ผ์ข
์ ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ง ์ ์์ง๋ง, ๊ฐ๋ฅํ๋ฉด ์ด์ ๊ฐ์ ์ด์ํ ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์๋ฐฑ ๊ฐ์ง ์ ํ ์ค๋ฅ ์ค ์์์ ๋ถ๊ณผํ๋ฏ๋ก ์ด๊ฒ์ ์๋ง๋ ๋งค์ฐ ๋ถ์์ ํ ๋ชฉ๋ก์ผ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๊ด์ฌ์ด ์๋ ๋ค๋ฅธ ์ฌ๋์๊ฒ๋ ๊ธฐ์กด ํ๋ก์ ํธ์ ๋์ผํ ์์ ์ ์๋ํ๊ณ ์ด๋ค ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๊ณต์ ํ๋ ๊ฒ์ด ์ ์ฉํ ์ ์์ต๋๋ค. ํน์ ์์ ๊ฐ ์ค์ ๋ก ์ด๊ฒ์ ๊ตฌํํ๋ ค๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์ง์นจ์ ์ ๊ณตํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@butchler ๋๋ ๋ํ ์ด๋ฌํ ๋ฌธ์ ์ค ์ผ๋ถ๋ฅผ something[i]
๋ฅผ something(i)
๋ก ๋ณด๊ธฐ ์์ํ์ต๋๋ค. ์ฆ, if (Meteor.user() && Meteor.user()._id) {...}
์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ' t ๋ฐฐ์ด ์ธ๋ฑ์ฑ์ ๋ํด ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ๋จผ์ ๋ฐฐ์ด์์ ๊ฒ์ฌํ๋ ค๋ ๊ฐ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ๋ด๊ฐ ๋งํ๋ ค๋ ๊ฒ์ ๊ธธ์ด ์์ฑ์ ํ์ธํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด์ค์
์ ๋ง๋๋ ๊ฒ์ด ์ ํ ์์คํ
์ ๋๋ฌด ๋ง์ ์คํธ๋ ์ค๋ฅผ ์ค ์ ์๋ค๋ ๊ฒ์ ์ดํดํ๊ธฐ ์ํด TS์ ์์กดํ๋ค๋ ๊ฒ์
๋๋ค. ์ ํ์ ๋ฏธ๋ฃจ๊ฒ ๋ง๋ ํ ๊ฐ์ง๋ (๋น์ ์ด ๋งํ๋ฏ์ด ์ผ๋ถ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ค๋ฅ๊ฐ ์๋ค๋ ์ฌ์ค ์ธ์) ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๊ฐ ์์ง ์ ๋๋ก ์๋ํ์ง ์๊ณ ๊ตฌ์กฐ ๋ถํด ๊ฐ์ด T | undefined
์๋์ง๋ง T
(๋ด ๋ค๋ฅธ ์๊ฒฌ ์ฐธ์กฐ).
๊ทธ ์ธ์๋ lib.es5.d.ts
์ฌ์ ์ํ๋ ๊ฒ์ด ์ข์ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฏธ๋์ ์ํฉ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋๋ฆฌ๋ฉด ์ถ๊ฐ ์ค๋ฅ๊ฐ ์ถ๊ฐ๋์ง ์์ง๋ง ์ผ๋ถ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ ์ด๋ฏธ ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ฌ์ฉํ๊ธฐ ์์ํ์ต๋๋ค patch-package
์ ๋ณํ์ ๋ํ ๋ช ๊ฐ์ง ์ ํ ์ ์ react
ํ๊ณ ์ด ๋ฐฉ๋ฒ์ ์ ์๋ ๋ณด์ธ๋ค.
๋๋ ๋ํ ์ด๋ฌํ ๋ฌธ์ ์ค ์ผ๋ถ๋ฅผ ๊ฒช์๊ณ , ๋ฌด์ธ๊ฐ[i]๋ฅผ ๋ฌด์ธ๊ฐ(i)๋ก ๋ณด๊ธฐ ์์ํ์ต๋๋ค. ์ฆ, if (Meteor.user() && Meteor.user()._id) { ...}, ๋ฐ๋ผ์ ๋ฐฐ์ด ์ธ๋ฑ์ฑ์ ๋ํด ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง ์์ต๋๋ค. ๋จผ์ ๋ฐฐ์ด์์ ๊ฒ์ฌํ๋ ค๋ ๊ฐ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
๋ค, ์ ๋ ์คํ์ ์๋ํ ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ ์ฝ๋:
if (array[i]) {
array[i].doSomething(); // causes a type error with our modified Array types
}
๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํด์ผํ์ต๋๋ค.
const arrayValue = array[i]
if (arrayValue) {
arrayValue.doSomething();
}
๋ด๊ฐ ๋งํ๋ ค๋ ๊ฒ์ ๊ธธ์ด ์์ฑ์ ํ์ธํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด์ค์ ์ ๋ง๋๋ ๊ฒ์ด ์ ํ ์์คํ ์ ๋๋ฌด ๋ง์ ์คํธ๋ ์ค๋ฅผ ์ค ์ ์๋ค๋ ๊ฒ์ ์ดํดํ๊ธฐ ์ํด TS์ ์์กดํ๋ค๋ ๊ฒ์ ๋๋ค.
์๋ง๋ ์ฌ์ค ์ผ ๊ฒ์
๋๋ค. ์ค์ ๋ก ๋ํ ์ฃผ์ฅ์ ๋ฐ๋ผ ์๋์ผ๋ก ์ฌ ์์ฑํ๋ ์ฝ๋์ ๋ํ codemod์ ์ฐ๊ธฐ ์ฌ์ธ ์ ์์ต๋๋ค .length
ํ์ดํ ๋ผ์ดํฐ ์ค๋งํธ ์ถฉ๋ถ์ด์ ๋ํ ์ฃผ์ฅ์ ๋ฐ๋ผ ์ ํ์ ๋ํ ์์ธํ ์ถ๋ก ํ ์ ์๋๋กํ๋ ๊ฒ๋ณด๋ค ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ .length
๐
๋ฏธ๋์ ์ํฉ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋๋ฆฌ๋ฉด ์ถ๊ฐ ์ค๋ฅ๊ฐ ์ถ๊ฐ๋์ง ์์ง๋ง ์ผ๋ถ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ ์ด๋ฏธ ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ด๊ฒ์ ์ข์ ์ ์
๋๋ค. ์ธ๋ฑ์ค ์ ํ์ undefined
๋ฅผ ํฌํจํ๋ ๊ฒ์ ์์ฒญ๋ ๋ณ๊ฒฝ ์ฌํญ์ด์ง๋ง ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋๋๋ค. T | undefined
๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ฝ๋๋ ๋ณ๊ฒฝ ์์ด T
๋ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ ์๋ฅผ ๋ค์ด ์ปดํ์ผ๋ฌ ํ๋๊ทธ๊ฐ ์๊ณ ํด๋น ์ปดํ์ผ๋ฌ ํ๋๊ทธ๊ฐ ํ์ฑํ๋์ง ์์ ํ๋ก์ ํธ์์ ๊ณ์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ T | undefined
์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๋ฐฐ์ด์ ๋ฌด์ํ๊ณ ์ ์ Record<string, T>
์ ์ง์คํ๋ฉด์ ์ ๊ฐ์ธ์ ์ธ ์์๋ฆฌ์คํธ๋ ์ฐ๊ธฐ๋ T
๋ง ํ์ฉํ์ง๋ง ์ฝ๊ธฐ๋ T|undefined
์
๋๋ค.
declare const obj : Record<string, T>;
declare const t : T;
obj["k"] = t; //ok
obj["k"] = undefined; //error, undefined not assignable to T
//T|undefined inferred,
//since we don't know if "k2" is an "ownProperty" of obj
const v = obj["k2"];
์์ ๊ฒ์ด ์ธ์ฒด๊ณตํ์ ์ผ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ผ์ข ์ ์ข ์ํ ํ์ดํ๊ณผ ์ข ์ํ ๊ฐ๋์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๋์์ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ์ข ๋ฅ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
//Shouldn't just be string[]
//Should also be something like (keyof valueof obj)[],
//A dependent type
const keys = Object.keys(obj);
๋ฐฐ์ด๋ก ๋์๊ฐ์ ๋ฌธ์ ๋ ๋ฐฐ์ด์ ์ธ๋ฑ์ค ์๋ช
์ด Record<number, T>
์ ๋์ผํ ์๋ ๋ฅผ ๊ฐ๊ณ ์์ง ์๋ค๋ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ ๋ค๋ฅธ ์ข ์ ์ ํ ๊ฐ๋๊ฐ ํ์ํฉ๋๋ค.
for (let i=0; i<arr.length; ++i) {
//i is not just number
//i should also be something like keyof valueof arr
}
๋ฐ๋ผ์ ๋ฐฐ์ด์ ์ธ๋ฑ์ค ์๋ช
์ ์ค์ ๋ก Record<number, T>
๊ฐ ์๋๋๋ค. Record<(int & (0 <= i < this["length"]), T>
(๋ฒ์ ๋ฐ ์ซ์ ์ง์ ์ ์ ์ ํ)์ ๋น์ทํฉ๋๋ค.
๋ฐ๋ผ์ ์๋ ๊ฒ์๋ฌผ์ด ๋ฐฐ์ด์ ๋ํด ์ด์ผ๊ธฐํ๋ ๋์ ์ ๋ชฉ์ "๋จ์ง" string
๋๋ "๋จ์ง" number
์์ธ ์๋ช
์ ์ ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ ์์ ํ ๋ค๋ฅธ ๋ ๊ฐ์ ํ ๋ก ์
๋๋ค.
TL;DR ์๋ ๊ฒ์๋ฌผ๊ณผ ์ ๋ชฉ์ ์๋ก ๋ค๋ฅธ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๋ฉฐ, ๋ ์ค ํ๋๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์์กด์ ํ์ดํ์ ํฌ๊ฒ ์์กดํฉ๋๋ค(ํ).
forEach
, map
, filter
๋ฑ๊ณผ ๊ฐ์ ํจ์๊ฐ ์กด์ฌํ๋ค๋ ์ ์ ๊ฐ์ํ ๋(IMHO๊ฐ ํจ์ฌ ๋ ์ ํธ๋จ), TS ํ์ด ์ถ๋ก ์์ง์ ์ผ๋ฐ for ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๋ํ ๋ฃจํ์ ์ง์ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฑ์ทจํ๋ ค๊ณ ํ๋ ๊ฒ์์ ์์ํ์ง ๋ชปํ ๋ณต์ก์ฑ์ด ๋๋ฌด ๋ง๋ค๋ ๋๋์ ๋ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด i
๋ ์์๊ฐ ์๋๋ฏ๋ก ๋ฃจํ ๋ด์์ ๋๊ตฐ๊ฐ i
๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋ฌผ๋ก , ๊ทธ๊ฒ์ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์ด์ง๋ง (๋ฐ๋ผ๊ฑด๋) ์ง๊ด์ ์ธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ์ธ๋ฑ์ค ์๋ช ์ ์์ ํ๋ ๊ฒ์ ์์ ์ค๋ช ์์ ๋ณผ ์ ์๋ฏ์ด ๋น๊ต์ ๊ฐ๋จํด์ผ ํฉ๋๋ค.
4. ๊ธฐ์กด ์ฝ๋๊ฐ ์ด๋ฏธ
.length
๊ฐ์ ๋ํด ์ผ๋ถ ์ฃผ์ฅ์ ํ๊ณ ๋ฐฐ์ด์ ์์์ ์ก์ธ์คํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด์ .length
๊ฒ์ฌ์๋ ๋ถ๊ตฌํ๊ณ ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฏ๋ก.length
๊ฒ์ฌ์ ์์กดํ์ง ์๋๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ค๋ณต!== undefined
๊ฒ์ฌ๋ฅผ ์ถ๊ฐํด์ผ ํ์ต๋๋ค. ํ์ดํ ๋ผ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๋ ์ฌ์ฉ์ ํ์ฉ ํ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ด๋ค.length
์ ํ์์ฑ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ธ!== undefined
ํ์ธ. ๋๋ ๊ทธ๊ฒ์ ์ค์ ๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ฌ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
@butchler
๊ถ๊ธํด์ ์ด ์ค ๋ณํ๋ ๋ณ์๋ก ์ ๊ทผํ๋ ๊ฒ๊ณผ ๊ณ ์ ๋ ์ซ์๋ก ์ ๊ทผํ๋ ๊ฒ์ ์ผ๋ง๋ ๋ ๊น์? ํ์์ ๊ฒฝ์ฐ TS๊ฐ ๋ฐฐ์ด ๊ธธ์ด๋ฅผ ์ถ์ ํ๋ ํํ๋ก ๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐฐ์ด์ ํํ๋ก ์์ฃผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ค์ ํํ๋ก ๋ค์ ์
๋ ฅํ๋ฉด ์ค๋ฅ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ๊ถ๊ธํฉ๋๋ค.
๋ฐฐ์ด์ ํํ๋ก ์์ฃผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ค์ ํํ๋ก ๋ค์ ์ ๋ ฅํ๋ฉด ์ค๋ฅ๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ๊ถ๊ธํฉ๋๋ค.
๋ณ์์ ์ ํ์ ํํ๋ก ๋ณํํ๊ธฐ ์ํด ๋ฐฐ์ด ๋ฆฌํฐ๋ด์ as const
๋ฅผ ์ถ๊ฐํ์ฌ ์ ํ ์ค๋ฅ๋ฅผ ์์ ํ ๊ฒฝ์ฐ๊ฐ ์์์ต๋๋ค. ๋๋ ์๋ฐฑ ๊ฐ์ ์ค๋ฅ ์ค ์ฝ 10๊ฐ๋ง ๋ณด์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ฐ๋ฆฌ ์ฝ๋๋ฒ ์ด์ค์์ ์ผ๋ง๋ ํํ์ง ์ ํ ๋ชจ๋ฆ
๋๋ค.
๋๋ ๋ํ ์ค๋ ์ด๊ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ณค๋ค.
๊ณ์ฐ๋ ์ธ๋ฑ์ค๋ฅผ ํตํด ๋ฐฐ์ด์์ ์ก์ธ์คํ๊ณ ์์ต๋๋ค. ํด๋น ์ธ๋ฑ์ค๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฝ๋์ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ์์ต๋๋ค.
const noNext = !items[currentIndex + 1];
๊ทธ ๊ฒฐ๊ณผ noNext
๊ฐ false
๋ก ์ ์๋ฉ๋๋ค. ์๋ชป๋ ๊ฒ์
๋๋ค. ์ฌ์ค์ผ ์ ์์ต๋๋ค.
๋ํ items
๋ฅผ Array<Item | undefined>
๋ก ์ ์ํ๊ณ ์ถ์ง ์์ต๋๋ค. ์๋ชป๋ ๊ธฐ๋๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด undefined
๋์ด์๋ ์ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ชป๋ ์์ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ undefined
์
๋๋ค.
๋ฌผ๋ก , ์์ ๋ฌธ์ ๋ ๋์ .length
๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ noNext
๋ฅผ boolean
๋ก ๋ช
์์ ์ผ๋ก ์ ์ํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ์ด๊ฒ์ TypeScript๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ ์ดํ๋ก ์ ๋ฅผ ๊ดด๋กญํ๋ ๊ฒ์
๋๋ค. ์ | undefined
๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋์ง ์๋์ง ์ดํดํ์ง ๋ชปํ์ต๋๋ค.
๋๋ถ๋ถ typescript-eslint๋ฅผ ์ฌ์ฉํ ๊ฒ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ฑ ํ ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ ์ ํ์ธํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ ์ ์๋ ๊ท์น์ด ์์ต๋๊น? ์ด๋ TS์ ์ง์์ด ๊ตฌํ๋๊ธฐ ์ ์ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋๊ตฐ๊ฐ์๊ฒ ๊ด์ฌ์ด ์์ ์ ์๋ ๊ฒฝ์ฐ. ์ด์ ๋๊ธ์์ lib.es5.d.ts
์ Array
์ธ๋ฑ์ฑ ์ ์๋ฅผ ํจ์นํ๋ ์ ๊ทผ ๋ฐฉ์์ด ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ๋ฐ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ๋ฐฐ์ด ๊ตฌ์กฐ ํด์ ์ ๋ํด ์ด์ํ ๋์์ด ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. ์ด์ ๋ฐ๋ผ ๋ฌ๋ผ ๋ณด์ธ๋ค target
์์ ์ต์
tsconfig.json
ํ๊ณ ์์ ๋ ์ ๋๋ก ์๋ es5
(https://github.com/microsoft/TypeScript/issues/37045 ).
์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ noEmit
์ต์
์ ์ฌ์ฉํ๊ณ ์๊ณ ํธ๋์คํ์ผ์ meteor
์ํด ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์๋ํ ์ ์๋ ์๋ฃจ์
์ safe-array-destructuring
(https://github.com/typescript-eslint/typescript-eslint/pull/1645)์
๋๋ค.
์์ง ์ด์์ด๋ฉฐ TypeScript ์ปดํ์ผ๋ฌ์์ ์ ์ฒด ๋ฌธ์ ๊ฐ ์์ ๋ ๋ ๊ฐ์น๊ฐ ์์ ์ ์์ง๋ง ์ ์ฉํ ์ ์๋ค๊ณ ์๊ฐ๋๋ฉด typescript-eslint
๊ท์น PR ์์ ์ฐ๋ ค ์ฌํญ/๊ฐ์ ์ฌํญ์ ์์ ๋กญ๊ฒ ํด๊ฒฐํ์ญ์์ค.
์ํ๊น๊ฒ๋ PR์์ eslint๋ฅผ ์ฌ์ฉํ ์์ ์ ๋ฐฐ์ด์ด ์๋ ํํ๋ง ์ง์ํฉ๋๋ค. ์ด๊ฒ๊ณผ ๊ด๋ จ๋ ์ฃผ์ ๋ฌธ์ ์ ์ฃผ์ ์ํฅ์ ์ด๋ ์ด ๊ตฌ์กฐํ์ ์์ต๋๋ค.
const example = (args: string[]) => {
const [userID, nickname] = args
}
๋๋ ์ด ์ ์ฒด ๋ฌธ์ ๊ฐ ๋ด๊ฐ ๋์ํ์ง ์๋ ์ชฝ์ผ๋ก ๊ฐ๋ค๊ณ ์๊ฐํฉ๋๋ค. forEach, map ๋ฑ ๋ด๋ถ์ ๊ฐ์ ๊ฒ์ฌ๊ฐ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ํ ๊ฐ๋ฅํ ๊ฒฝ์ฐ for์ ๋ชจ๋ ์ฌ์ฉ์ ํผํ๋ ค๊ณ ์๋ํ๋ฏ๋ก ์ด๊ฒ์ ํผํ๋ ค๋ ์ถ๋ก ์ด ์ ์๊ฒ ๋ ์ดํด๊ฐ ๋ฉ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋๋ ์ด๊ฒ์ด ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๋ฅผ ์ง์ํ๋ ๋ฐ ์ฌ์ ํ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ธ์์, ๊ทธ๊ฒ์ ๋จ์ง ๋ชจ๋ ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด์ ์ค๋ฅ๊ฐ ์์ผ๋ฏ๋ก ์ธ๋ฑ์ฑ์ ์ฌ์ฉํ์ฌ ์ํํด์ผ ํฉ๋๋ค.
๊ทธ๋๋ ๋์์ง ์์ฃ ? Array Destructuring์ ๋๋ผ์ด ๊ธฐ๋ฅ์ ๋๋ค. ๋ฌธ์ ๋ ์ ๋ ฅ์ด ์ ํํ์ง ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ธฐ๋ฅ์ ๋นํ์ฑํํ๋ ๊ฒ์ ์ค์ ๋ก ์ข์ ์๋ฃจ์ ์ด ์๋๋๋ค. ์์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ด ์๊ฐ์ ๋ ์ถ์ ํ(์ฝ๊ณ ์ดํดํ๊ธฐ ์ด๋ ค์ด) ์ฝ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
๋ ๋ณด๊ธฐ ํํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ์์๊ฐ ์ ์๋์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋๋ก ๊ฐ์ ํฉ๋๋ค. ๋ ์ฐ์ํ ํด๊ฒฐ์ฑ ์ ์๊ฐํด ๋์ง๋ง ์ด๊ฒ์ด ๊ฐ์ฅ ๋จ์ ์ด ์ ์ ๊ฒ ๊ฐ์ต๋๋ค. ์ ์ด๋ ์ฐ๋ฆฌ์ ์ฌ์ฉ ์ฌ๋ก์์๋.
@caseyhoward ์ด ๋ฌธ์ ์์ ์ด์ ์ ์ธ๊ธํ๋ฏ์ด ๋ค์ํ Array.prototype ํจ์์์ ์์น ์๋ ๋์์ด ๋ฐ์ํฉ๋๋ค.
x.forEach( (i: string) => { ... } ) // Error because i has type string | undefined
์ด๊ฒ์ array.prototype ํจ์์์ ์์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ์ด๋ ์ด ๊ตฌ์กฐ ๋ถํด์ ๋ํ ์์ฒญ๋ ๋ฌธ์ ์ ๋๋ค!
์ค๋ ๋ค์ ์ด๊ฒ์ ๋ถ๋ช์ณค๋ค. ๋๋ ์ฌ์ ํ ์ฌ๋ฐ๋ฅธ ํํ ์ด ์ด๊ฒ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ๋ํ ํผ๋๋ฐฑ์ ๋ฐ๊ณ ์ถ์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก - typescript-eslint๋ฅผ ์ฌ์ฉํ๊ณ no-unnecessary-condition
ํ์ฑํํ ๋ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ณผ๊ฑฐ์๋ ์ธ๋ฑ์ค๋ก ๋ฐฐ์ด์ ์ก์ธ์คํ์ฌ ํด๋น ์ธ๋ฑ์ค์ ์์์ ๋ํ ์์
์ ์ํํ ๋ array[i]?.doSomething()
์์์ ๊ฐ์ด ์ธ๋ฑ์ค๊ฐ ์ ์๋์๋์ง ํ์ธํ๊ธฐ ์ํด ์ ํ์ ์ฐ๊ฒฐ์ ์ฌ์ฉํ์ต๋๋ค(์ธ๋ฑ์ค๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ) no-unnecessary-condition
๋ ์ ํ์ ์ฐ๊ฒฐ์ด ๋ถํ์ํ ๊ฒ์ผ๋ก ํ๋๊ทธ๋ฅผ ์ง์ ํ๊ณ (์ ํ ์คํฌ๋ฆฝํธ์ ๋ฐ๋ผ ์ ํ์ด null์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์) ์๋ ์์ ์ด ์ ํ์ ์ฐ๊ฒฐ์ ์ ๊ฑฐํ์ฌ ์ธ๋ฑ์ค i
์ค์ ๋ก๋ ์ ์๋์ด ์์ง
์ด ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ๋ด ์์ฉ ํ๋ก๊ทธ๋จ, ๋ ํญ์ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ์์์ ์์ ์ ์๊ธฐํด์ผ ๋ด๊ฐ ๋ค์ฐจ์ ๋ฐฐ์ด์ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค๋ก ๋งค์ฐ ๋ฒ๊ทธ๊ฐ๋์๋ค xs[i]?.[j]
๋์ xs[i][j]
, ๋ํ ๋ด๊ฐ ๋ช
์ ์ ์ผ๋ก ์บ์คํ
ํด์ผ ์ ํ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด const element = xs[i]?.[j] as Element | undefined
์ ๊ฐ์ ์ก์ธ์ค ์์.
์ด๊ฒ์ ๋ง๋๋ ๊ฒ์ Typescript์์ ๋์ ์ฒซ ๋ฒ์งธ ํฐ wtf์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ์ด๊ฐ ๋๋ผ์ธ ์ ๋๋ก ์ ๋ขฐํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ณ ์ด๊ฒ์ด ๋๋ฅผ ์ค๋ง์์ผฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด ์ก์ธ์ค์ "as T | undefined"๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์๋นํ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค. ์ ์ ์ค ํ๋๊ฐ ๊ตฌํ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
๋ค, ์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ( | undefined
) ํ์
์์ ์ฑ์ ๊ฐ๋ ์ฐ๋ฆฌ ์์ ์ ํ์
์ ๋กค์์ํ๋๋ก ๊ฐ์ํ์ต๋๋ค. ๋๋ถ๋ถ ๊ฐ์ฒด ์ก์ธ์ค๋ฅผ ์ํ ๊ฒ์ด์ง๋ง(์๋ง๋ ๋ณ๋์ ์ด๋ฆฐ ๋ฌธ์ ์ผ ์ ์์) ๋ฐฐ์ด ์ธ๋ฑ์ค์ ์ก์ธ์คํ๋ ๋ฐ์๋ ๋์ผํ ๋
ผ๋ฆฌ๊ฐ ์ ์ฉ๋ฉ๋๋ค.
๋ฌธ์ ๋ฅผ ์ฐ๊ฒฐํ๊ฑฐ๋ ์์ ๋ฅผ ๋ณด์ฌ์ค ์ ์๋ค๋ ๊ฒ์ด ๋ฌด์จ ๋ง์ธ์ง ์ ๋ชจ๋ฅด์ญ๋๊น?
2020๋
4์ 29์ผ ์์์ผ ์ค์ 2์ 41๋ถ Kirill Groshkov [email protected]
์ผ๋ค:
๋ค, ์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ( |
์ ์๋์ง ์์) ์ ํ ์์ ์ฑ์ ๊ฐ์ต๋๋ค. ์ฃผ๋ก ๊ฐ์ฒด ์ก์ธ์ค๋ฅผ ์ํด(์๋ง๋
๋ณ๋์ ๋ฏธ๊ฒฐ ๋ฌธ์ ), ๋ฐฐ์ด ์ธ๋ฑ์ค ์ก์ธ์ค์๋ ๋์ผํ ๋ ผ๋ฆฌ๊ฐ ์ ์ฉ๋ฉ๋๋ค.โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/microsoft/TypeScript/issues/13778#issuecomment-621096030 ,
๋๋ ๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/AAAGFJJT37N54I7EH2QLBYDRO7Y4NANCNFSM4C6KEKAA
.
@alangpierce
์ ๋งํ ๊ฒ ๊ฐ์ ํ ๊ฐ์ง ์์ด๋์ด: ์ธ๋ฑ์ค ์๋ช ์ ์ ์ํ ๋
?:
์ฌ์ฉํ์ฌ ์ ์์ ์ธ ์ฌ์ฉ์์ ๋๋๋ก ๊ฐ์ด ๋๋ฝ๋ ๊ฒ์ผ๋ก ์์ํ๋ค๋ ๊ฒ์ ๋ํ๋ผ ์ ์๋ค๋ฉด ์ด๋จ๊น์? ์์์ ์ธ๊ธํ| undefined
์ฒ๋ผ ์๋ํ์ง๋ง ๋ถํธํ ๋จ์ ์ด ์์ต๋๋ค. ๋ช ์์ ์ธundefined
๊ฐ์ ํ์ฉํ์ง ์์์ผ ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ธ?:
์ ์ฐจ์ด์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ ๊ฐ๋ฆฌํค๋ ํฅ๋ฏธ๋ก์ด ์์ด๋์ด์
๋๋ค. ๊ทธ๋ฌ๋ ๋
ผ๋ฆฌ๋ฅผ ๋ค์ง๊ฒ ์ต๋๋ค. ๊ธฐ๋ณธ ๊ฒฝ์ฐ๋ ์ธ๋ฑ์ค ์๋ช
์ | undefined
ํฌํจ๋์ด์ผ ํฉ๋๋ค. ์ปดํ์ผ๋ฌ์ ์ ์๋์ง ์์ ๋์๋ฌธ์๊ฐ ์ฝ๋์์ ๋ฐ์ํ์ง ์๋๋ก ํ๋ ค๋ฉด(๋ฐ๋ผ์ ์๋ชป๋ ํค์ ์ก์ธ์คํ์ง ์์) ๋ค์๊ณผ ๊ฐ์ด ์๋ช
์ !:
๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
type AlwaysDefined = {[key: string]!: string};
const t: AlwaysDefined = {};
t['foo'] // Has type string
!:
๊ฐ ์๋ ๊ธฐ๋ณธ ์ผ์ด์ค๋ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ ์์ ํฉ๋๋ค.
type MaybeUndefined = {[key: string]: string};
const t: MaybeUndefined = {};
t['foo'] // Has type string | undefined
๊ทธ๋ ๊ฒ ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ด ๋ณด์ฅ๋๋ฉฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก undefined
๋ฅผ ์ค์๋ก ์ธ ์ ์๋๋ก undefined
๋ฅผ ๋ช
์์ ์ผ๋ก ํฌํจํ ํ์๊ฐ ์์ต๋๋ค.
์ด๋ฏธ ์ ์๋ ๊ฒฝ์ฐ ์ฃ์กํฉ๋๋ค. ์ด ์ค๋ ๋์ ๋ชจ๋ ๋๊ธ์ ์ฝ์ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ํ์ฌ์ ๊ธฐ๋ณธ ๋์์ ์ฌ์ฉ์๊ฐ TypeScript๋ฅผ ์ฌ์ฉํ ๋ ๊ธฐ๋ํ๋ ๊ฒ๊ณผ ๋ค๋ฆ ๋๋ค. ํนํ ์ปดํ์ผ๋ฌ๊ฐ ์ด์ ๊ฐ์ด ์ฝ๊ฒ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ ์ ์๋ ๊ฒฝ์ฐ ๋ฏธ์ํ ๊ฒ๋ณด๋ค ์์ ํ ๊ฒ์ด ์ข์ต๋๋ค.
index.d.ts๋ฅผ ๋ด ํ๋ก์ ํธ์ ํจ๊ป ์ฌ์ฉํ ์ ์์๊ณ ์ค์ ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ง๋ ์์์ต๋๋ค.
์ ํ ๊ฐ๋๋ฅผ ๊ฐ์ ํ๋ ์ด ์์ ํดํน์ ๋ง๋ค์์ต๋๋ค.
const firstNode = +!undefined && nodes[0];
์ ํ์ด 0 | T
๋ก ๋๋๋๋ผ๋ ์ฌ์ ํ ์์
์ ์ํํฉ๋๋ค.
const firstNode = nodes?.[0]
์๋ํ์ง ์์ต๋๊น?
@ricklove ๋จ์ํ 1
๋ณด๋ค +!undefined
๋ฅผ ์ ํธํ๋ ์ด์ ๊ฐ ์์ต๋๊น?
const firstNode = nodes?.[0]
์๋ํ์ง ์์ต๋๊น?
์๋์, typescript๋ (๋ด ์๊ฐ์๋) ๊ทธ๊ฒ์ ์ ํ ์ฌํญ์ผ๋ก ์ทจ๊ธํ์ง ์์ต๋๋ค(#35139 ์ฐธ์กฐ).
Flow์ ๋ฌธ์ ์ ๋ฐ๋ฅด๋ฉด ์ธ๋ฑ์ค ์๋ช ์ ๋์์ ํ์ฌ TypeScript์ ๋์๊ณผ ๋์ผํฉ๋๋ค.
๊ฐ์ฒด ์ ํ์ ์ธ๋ฑ์ ์์ฑ์ด ์๋ ๊ฒฝ์ฐ ๋ฐํ์์ ๊ฐ์ฒด์ ํด๋น ์ฌ๋กฏ์ ๊ฐ์ด ์๋๋ผ๋ ์์ฑ ์ก์ธ์ค๋ ์ฃผ์์ด ์๋ ์ ํ์ ๊ฐ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๋ฐฐ์ด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ก์ธ์ค๊ฐ ์์ ํ์ง ํ์ธํ๋ ๊ฒ์ ํ๋ก๊ทธ๋๋จธ์ ์ฑ ์์ ๋๋ค.
var obj: { [number]: string } = {};
obj[42].length; // No type error, but will throw at runtime
๋ฐ๋ผ์ ์ด ๋ฌธ์ ์์ TS์ Flow๋ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ปดํ์ผ๋ฌ๋ฅผ ๋๋ ๋์ ์ ์๋์ง ์์ ํค๋ฅผ ์๊ฐํ ๊ฒ์ ์๊ตฌํฉ๋๋ค.
์ปดํ์ผ๋ฌ๊ฐ ์ฌ์ฉ์๊ฐ ์ด๋ฌํ ์ข ๋ฅ์ ๋ฒ๊ทธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค๋ฉด TS์ ์ด์ ์ด ๋ ๊ฒ์ ๋๋ค. ์ด ์ค๋ ๋์ ๋ชจ๋ ๋๊ธ์ ์ฝ์ผ๋ฉด ์ฌ๊ธฐ ์๋ ๋๋ค์๊ฐ ์ด ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์ถ์ดํ ๊ฒ ๊ฐ์ต๋๋ค. TSํ์ ์์ง๋ 100% ๋ฐ๋ํ๋์?
TS๊ฐ ์ด๊ฒ์ ์ ์ธํ๊ณ ์ ์๋์ง ์์ ๋ฉค๋ฒ์ ๋ํ ์ก์ธ์ค๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ต์ ์ ๋คํ๊ณ ์๋ค๋ ๊ฒ์ ์ด๋ฆฌ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ์ง๊ธ๊น์ง ์ฐ๋ฆฌ ์ฝ๋๋ฒ ์ด์ค์์ ์์ ํ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฒ๊ทธ์ ๋๋ค.
[ #38470์์ ์ฌ๊ธฐ๋ก ํ ๋ก ์ด๋]
์ด๊ฒ์ด ๋ฐฐ์ด์ ์ค์ฉ์ ์ด์ง ์์ ์ด์ ์ ๋ํ ๋ชจ๋ ์ธ์๋ฅผ ์๋ฝํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด Tuples์ ๋ํด ํ์คํ ํด๊ฒฐ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
// tuple
var str = '';
var num = 100
var aa = [str, num] as const
// Awesome
var shouldBeString = aa[0] // string
var shouldBeNumber = aa[1] // number
var shouldError = aa[10000]; // type error
// Not so awesome
var foo = aa[num] // string | number
์ foo string | number | undefined
๋ง๋ค์ง ์์ต๋๊น?
์ด๊ฒ์ ํํ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค์์ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์์์ผ ํ๋ฉฐ, ์ํฅ์ ๋ฐ๋ ์ฌ์ฉ์๋ strictNullChecks
ํ์ฑํํ๊ณ ๋ฐฐ์ด์ ์์๋ก ์ ์ธํด์ผ ํฉ๋๋ค...
๊ทธ๋ค์ ๋ถ๋ช
ํ ๋ ์๊ฒฉํ ์ ํ์ ์์ ์ ์ฐพ๊ณ ์์ต๋๋ค.
๋ํ ์ด๊ฒ๋ค์ ๋์ธ ์ ์์ต๋๋ค
var notString1 = aa[Infinity]; // no error, not undefined
var notString2 = aa[NaN]; // no error, not undefined
number
๊ฐ NaN
๊ฐ ๋ ๋ค์ ํํ์์ undefined
๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์๋ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ชจ๋ ์ ํ ์์ ํ์ต๋๋ค.
ํํ์ด ์ค์ ๋ก ๊ทธ๋ ๊ฒ ๋ค๋ฅธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ค์ ๋๋จธ์ง ์ ํ(์: [str, ...num[]]
)์ ์์ฉํด์ผ ํ๊ณ ๊ธฐ์ ์ ์ผ๋ก aa[Infinity]
๋ ์๋ฒฝํ๊ฒ ์ ํจํ Javascript์ด๋ฏ๋ก ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ฒํ๋ ๊ฒ์ด ๋ณต์กํด์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๊ทํ์ ๊ฒ์๋ฌผ์ ๋ํ ์ธ๋ฑ์ค ๋ฐํ์ ์ ์๋์ง ์์ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ๋ํ ์ง์์ ๋ฐ๊ฒ ๋๋ค๋ฉด ์ด๋ค ๋ชจ์ต์ผ์ง ์๊ฐํ๊ฒ ํ์ต๋๋ค. ๊ทํ์ ์์์์ ๊ฐ์ด aa[num]
์ค์ ๋ก string | number | undefined
๋ก ์
๋ ฅํ๋ค๋ฉด, ์ธ๋ฑ์ค๊ฐ ๊ฒฝ๊ณ๋ฅผ ์ ์งํ๋ค๋ ๊ฒ์ ์๋ฉด์๋ for (let i = 0; i < 2; i++) { foo(aa[i]!); }
๋ฅผ ์์ฑํด์ผ ํฉ๋๊น? ๋์๊ฒ ์๊ฒฉํ null ๊ฒ์ฌ๊ฐ ๋ด๊ฐ ์์ฑํ ํญ๋ชฉ์ ํ๋๊ทธ๋ฅผ ์ง์ ํ ๋ ์ฒ์์ ๋ ๋์ ๊ฒ์ ์
๋ ฅํ๊ฑฐ๋ ๋ฐํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. null์ด ์๋ ์ด์ค์
์ ์์กดํด์ผ ํ๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ด ์ชฝ์ ์คํจ๋ก ๋ด. ํ์ง๋ง ์ด ๊ฒฝ์ฐ์๋ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๊ฒ ์ ๋ฅผ ๊ท์ฐฎ๊ฒ ํฉ๋๋ค.
tuple[number]
ํญ์ T | undefined
์
๋ ฅ๋๋ค๋ฉด ์ธ๋ฑ์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฒฝ๊ณ๊ฐ ์ง์ ๋์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ์๊ฒ ์ต๋๊น?
@thw0rted Typescript( .map
๋ฐ .reduce
ftw)์์ "ํด๋์" for
๋ฃจํ๋ฅผ ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉํ ์๊ฐ์ด ๊ธฐ์ต๋์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์ปดํ์ผ๋ฌ ์ต์
์ด ํ๋ฅญํ imo๊ฐ ๋๋ ์ด์ ์
๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ํด์ ๋ ์ ์์). ๋ง์ ํ๋ก์ ํธ์์ ๊ทํ๊ฐ ์ ๊ณตํ ๊ฒฝ์ฐ์ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํ์ง ์์ผ๋ฉฐ ๋ฐฐ์ด ๊ตฌ์กฐ ํด์ ๋ฑ์ ์ธ๋ฑ์ค ์๋ช
๋ง ์ฌ์ฉํฉ๋๋ค.
(๋ด ์๋ ์๊ฒฌ: https://github.com/microsoft/TypeScript/issues/13778#issuecomment-517759210)
์, ์์งํ ๋งํ๋ฉด for-loop๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ์ ์์ฑํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ต๋๋ค. ๋๋ Object.entries
๋๋ Array#map
๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ์ง๋ง ๊ฐ๋์ ํค๋ฅผ ์ ๋ฌํ์ฌ ๊ฐ์ฒด์ ๋ํ ์์ธ์ ์์ฑํ๊ฑฐ๋ (์๋ง๋ ๋ ์์ฃผ) ๋ฐฐ์ด์ด๋ ํํ์ ๋ํ ์์ธ์ ์ ๋ฌํด์ผ ํฉ๋๋ค. for
๋ฃจํ๋ ํ์คํ ์ธ์์ ์ธ ์์์ง๋ง, ์ด๋ ์ชฝ ์ต์
( undefined
์ด๋ ์๋๋ )์ ๋จ์ ์ด ์๋ค๋ ์ ์ ์ ๊ธฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ด๋ ์ต์ (
undefined
์ด๋ ์๋๋ )์ ๋จ์ ์ด ์๋ค๋ ์ ์ ์ ๊ธฐํฉ๋๋ค.
์, TypeScript ์ฌ์ฉ์๊ฐ ์ ํธํ๋ ๋จ์ ์ ์ ํํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.wink:
์, ์์งํ ๋งํ๋ฉด for-loop๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ์ ์์ฑํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ต๋๋ค. ๋๋
Object.entries
๋๋Array#map
๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ์ง๋ง ๊ฐ๋์ ํค๋ฅผ ์ ๋ฌํ์ฌ ๊ฐ์ฒด์ ๋ํ ์์ธ์ ์์ฑํ๊ฑฐ๋ (์๋ง๋ ๋ ์์ฃผ) ๋ฐฐ์ด์ด๋ ํํ์ ๋ํ ์์ธ์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
ํ์ํ ๊ฒฝ์ฐ Array#entries
์ฌ์ฉํ ์ ์์ต๋๋ค.
for (const [index, foo] of array.entries()) {
bar(index, foo)
}
์ ๋ ๊ฐ์ธ์ ์ผ๋ก Array#forEach
๊ทธ๋ ๊ฒ ๋ง์ด ์ฌ์ฉํ์ง ์์ผ๋ฉฐ, ๋ฐ๋ณต์ ์ํด Array#map
๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค(๋งคํ์๋ ํญ์ ์ฌ์ฉํฉ๋๋ค). ๋๋ ๋ด ์ฝ๋๋ฅผ ํํํ๊ฒ ์ ์งํ๋ ๊ฒ์ ์ ํธํ๋ฉฐ for...of ๋ฃจํ์์ ๋ฒ์ด๋ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ฌํฉ๋๋ค.
ํํ์ด ์ค์ ๋ก ๊ทธ๋ ๊ฒ ๋ค๋ฅธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ค์ ๋๋จธ์ง ์ ํ(์:
[str, ...num[]]
)์ ์์ฉํด์ผ ํ๊ณ ๊ธฐ์ ์ ์ผ๋กaa[Infinity]
๋ ์๋ฒฝํ๊ฒ ์ ํจํ Javascript์ด๋ฏ๋ก ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ฒํ๋ ๊ฒ์ด ๋ณต์กํด์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.๊ทํ์ ๊ฒ์๋ฌผ์ ๋ํ ์ธ๋ฑ์ค ๋ฐํ์ ์ ์๋์ง ์์ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ๋ํ ์ง์์ ๋ฐ๊ฒ ๋๋ค๋ฉด ์ด๋ค ๋ชจ์ต์ผ์ง ์๊ฐํ๊ฒ ํ์ต๋๋ค. ๊ทํ์ ์์์์ ๊ฐ์ด
aa[num]
์ค์ ๋กstring | number | undefined
๋ก ์ ๋ ฅํ๋ค๋ฉด, ์ธ๋ฑ์ค๊ฐ ๊ฒฝ๊ณ๋ฅผ ์ ์งํ๋ค๋ ๊ฒ์ ์๋ฉด์๋for (let i = 0; i < 2; i++) { foo(aa[i]!); }
๋ฅผ ์์ฑํด์ผ ํฉ๋๊น? ๋์๊ฒ ์๊ฒฉํ null ๊ฒ์ฌ๊ฐ ๋ด๊ฐ ์์ฑํ ํญ๋ชฉ์ ํ๋๊ทธ๋ฅผ ์ง์ ํ ๋ ์ฒ์์ ๋ ๋์ ๊ฒ์ ์ ๋ ฅํ๊ฑฐ๋ ๋ฐํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. null์ด ์๋ ์ด์ค์ ์ ์์กดํด์ผ ํ๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ด ์ชฝ์ ์คํจ๋ก ๋ด. ํ์ง๋ง ์ด ๊ฒฝ์ฐ์๋ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๊ฒ ์ ๋ฅผ ๊ท์ฐฎ๊ฒ ํฉ๋๋ค.
tuple[number]
ํญ์T | undefined
์ ๋ ฅ๋๋ค๋ฉด ์ธ๋ฑ์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฒฝ๊ณ๊ฐ ์ง์ ๋์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ์๊ฒ ์ต๋๊น?
ํํ์ ๋ฐ๋ณตํ๋ for(let i..)
์ด ๊ทธ๋ ๊ฒ ๋ง์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํํ์ ๋จ์ผ ์ ํ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ ,
๋ด ๊ฒฝํ์ ํํ์ ํผํฉ ์ ํ์ ์ ํฉํ๋ฉฐ ์ด๊ฒ์ด ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด์จ๋ ์ ํ ๊ฒ์ฌ๋ฅผ ํ๊ณ ์์ต๋๋ค.
var str = '';
var num = 100
var aa = [str, num] as const
for (let i = 0; i < aa.length; i++) {
aa[i] // needs some type check anyway to determine if 'string' or 'number'
}
๋ํ ์ด ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ฌ๋๋ค์ด ์ด๋ฅผ ์ํํ์ง ๋ชปํ๊ฒ ํ๋ ๊ฒ์ ๋ฌด์์ ๋๊น?
// this sucks
for (let i = 0; i < 2; i++) {
foo(aa[i]!); // ! required
}
// this would work
for (let i = 0 as 0 | 1; i < 2; i++) {
foo(aa[i]); // ! not required
}
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ 0 | 1
๋์ keyof typeof aa
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฌผ๋ก i
์ฐ์ ์ ์ํํ ๋ ์ ํ ์์ ์ ์์ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๋๋ค์ด ๊ธฐ๋ณธ "์๊ฒฉํ๊ฒ ์ ํ ์์ ํ์ง๋ ์์ง๋ง ํธ๋ฆฌํ" ๋ฐฐ์ด๋ณด๋ค ์ ํ ์์ ์ ์ํด ์ด๊ฒ์ ์ ํํ ์ ์์ต๋๋ค.
??
๋ฐ ?.
์ฐ์ฐ์๊ฐ ์๋ค๋ ๊ฒ์ Array
๋ํ ์์ ์ก์ธ์ค๋ฅผ ์ํํ๋ ๊ฒ์ด ๋ ์ด์ ์ง๋์น๊ฒ ๋ฒ๊ฑฐ๋กญ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ํ ์๋ง๋ ํจ์ฌ ๋ ์ผ๋ฐ์ ์ผ ๊ฒ์
๋๋ค.
.map
๋๋ .forEach
์ ๊ฒฝ์ฐ " T | undefined
"๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ ์ฝ๋ฐฑ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ธ๋ฑ์ค์์ ์คํ๋์ง ์์) ๋๋Array
๋ฅผ ์ํํฉ๋๋ค. ๊ทธ ์ค ์ผ๋ถ๋ ์ ์ ์ผ๋ก ์์ ํ๋ค๊ณ ํ๋จ๋ ์ ์์ต๋๋ค( for...of
.. ๊ฑฐ์ _sparse arrays_ ์ ์ธ, for...in
์์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค).๋ํ ๋ณ์๊ฐ ๋จผ์ <index> in <array>
ํ์ธ๋๋ฉด "์์ ํ ์ธ๋ฑ์ค"๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค.
_Clarification_ : ๋๋ ์๋ ์ด์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ Array<T>
์ธ๋ฑ์ค ์ ํ ๊ฐ์ง๊ณ ์์ง [number]: T | undefined
(๋์ ์ ๋จ์ง [number]: T
๊ฐ ์ฌ์ฉํ๊ธฐ์ ๋๋ฌด ๋ณต์ก ๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค).
๋ ์ด์ ๊ทธ๋ ์ง ์์ผ๋ฏ๋ก undefined
์ถ๊ฐํ ์ ์์ต๋๋ค.
@vp2177 ๋ฌธ์ ๋ ๊ธฐ๋ฅ์ด ์๋๋๋ค(์, ?.
์๋). ๋ฌธ์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ด์ ๋ํด ๊ฒฝ๊ณ ํ์ง ์๊ณ ๋ฐ์ ์๋ ๊ฒ์ ๋ฐฉ์งํ๋ค๋ ๊ฒ์
๋๋ค.
Linting ๊ท์น์ด ๊ฐ๋ฅํ์ง๋ง ์ฌ์ ํ ๊ทธ๋ ์ต๋๋ค.
์,
?.
์๋ํฉ๋๋ค
๋ฌ๋ผ์. ?.
๋ ์ธ๋ฑ์ฑ๋ ๊ฐ์ ์์ฑ์ ์ก์ธ์คํ๋ ๋ฐ ์๋ํ์ง๋ง ์ปดํ์ผ๋ฌ๋ ๊ฐ์ด ์ ์๋์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๊ฐ์ด ์ ์๋์๋ค๊ณ ๊ณ์ ๋งํฉ๋๋ค(#35139 ์ฐธ์กฐ).
๊ฑฐ๊ธฐ์ ์ถ๊ฐํ๊ธฐ ์ํด eslint๋ฅผ ์ฌ์ฉํ๊ณ no-unnecessary-condition
๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ์์ ์ ์๋์ง ์์ ํญ๋ชฉ์ด ์๋๋ฉฐ ?.
๋ถํ์ํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ก์ธ์ค๋ ๋ถํ์ํ ๊ฒ์ผ๋ก ํ์๋๊ณ ์ ๊ฑฐ๋ฉ๋๋ค.
@martpie ์ฃ์กํฉ๋๋ค ์ ์๊ฒฌ์ ์คํดํ์ ๊ฒ
๋ด ๋ง์... --strictIndexChecks
๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ด ์ฌ๋๋ค์ด ์ด๋ฌํ ์ ํ์ ํ๋์ ์ ํํ ์ ์๋๋ก ํ๋ ์ข์ ์๊ฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ชจ๋ ์ฌ๋์ ์ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋๋ฉฐ ๋ณด๋ค ์๊ฒฉํ ์ ํ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
๋๋ Flow
๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ฑ์ค์ ๋ํด ์ด๋ฐ ์์ผ๋ก ์๋ํ๊ณ ์์ ์ธ๊ธํ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@bradennapier Flow
๋ Array
์ ์ธ๋ฑ์ค ์๋ช
์์๋ T | undefined
๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค (๋ถํํ๋ TypeScript์ ๋์ผ).
๋๋ ์ด์ ์ ๋ชจ๋๋ฅผ ํ๋ณตํ๊ฒ ํ ์ ์๋ ์ ๊ทผ ๋ฐฉ์์ ์ ์ํ์ต๋๋ค. ๋ค๋ฅธ ๋ง๋ก ๋ฐ๋ณตํด๋ ๊ด์ฐฎ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ฑ์ค ์๋ช ์ ๊ธฐ๋ณธ ๋์์ ๋ค์์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
| undefined
ํฌํจ| undefined
ํฌํจํ์ง ๋ง์ญ์์ค(๊ฐ์ฒด์์ T
๊ฐ๋ง ์ํ๊ธฐ ๋๋ฌธ์)์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
type MaybeUndefined = {[key: string]: string};
const t: MaybeUndefined = {};
const x = t['foo'] // Has type string | undefined
t['foo'] = undefined // ERROR!
t['foo'] = "test" // Ok
undefined
๊ฐ ์ ํ์ ํฌํจ๋๋ ๊ฒ์ ์ํ์ง ์๋ ์ฌ๋๋ค์ ์ปดํ์ผ๋ฌ ์ต์
์ ์ฌ์ฉํ์ฌ ๋นํ์ฑํํ๊ฑฐ๋ !
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ถ ์ ํ์ ๋ํด์๋ง ๋นํ์ฑํํ ์ ์์ต๋๋ค.
type AlwaysDefined = {[key: string]!: string};
const t: AlwaysDefined = {};
const x = t['foo'] // Has type string
t['foo'] = undefined // ERROR!
t['foo'] = "test" // Ok
๊ธฐ์กด ์ฝ๋๋ฅผ ์์์ํค์ง ์์ผ๋ ค๋ฉด undefined
๊ฐ ํฌํจ๋๋๋ก ํ๋ ์ ์ปดํ์ผ๋ฌ ์ต์
์ ๋์
ํ๋ ๊ฒ์ด ๋ ๋์ ์๋ ์์ต๋๋ค(์์ MaybeUndefined
์ ํ๊ณผ ํจ๊ป ํ์๋จ). ํด๋น ์ต์
์ ์ง์ ํ์ง ์์ผ๋ฉด ๋ชจ๋ ์ธ๋ฑ์ค ์๋ช
์ ํ์ด ์ ์ธ ๋ด์์ !
์ฐ์ฐ์๊ฐ ์ฌ์ฉ๋ ๊ฒ์ฒ๋ผ ์๋ํฉ๋๋ค.
๋ ๋ค๋ฅธ ์์ด๋์ด๊ฐ ๋ ์ค๋ฆ
๋๋ค. ์ฝ๋์ ์ผ๋ถ ์์น์์ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋์( undefined
์ฌ๋ถ)์ผ๋ก ๋์ผํ ์ ํ์ ์ฌ์ฉํ๊ณ ์ถ์ ์ ์์ต๋๋ค. ์ ์ ํ ๋งคํ์ ์ ์ํ ์ ์์ต๋๋ค.
type MakeDefined<T> = {[K in keyof T]!: T[K]}
TypeScript์ ์ข์ ํ์ฅ์ด ๋ ๊น์?
์์ด๋์ด๊ฐ ๋ง์์ ๋ค์ง๋ง ๋จผ์ https://github.com/microsoft/TypeScript/issues/2521 ์ ๊ฐ์ ธ์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์คํดํ์ง ๋ง์ธ์. ์ฌ์ ํ ์ฐ๋ฆฌ๊ฐ ์ ๋์ ์ผ๋ก
@bradennapier
Flow
๋Array
์ ์ธ๋ฑ์ค ์๋ช ์์๋T | undefined
๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค (๋ถํํ๋ TypeScript์ ๋์ผ).
ํ ๊ฐ์ฒด ์ธ๋ฑ์ค๋ ์ด๋ป์ต๋๊น? ๋ฐฐ์ด์ ๋ํ ํ์์ฑ์ ๋๋ ์ ์ ์์ง๋ง ๊ฐ์ฒด๋ฅผ โโ์ฌ์ฉํ ๋ ํ์ธํ๊ฒ ๋ง๋๋ ๊ฒ์ ๊ฝค ํ์คํฉ๋๋ค.
@bradennapier ๊ฐ์ฒด ์ธ๋ฑ์ค? o[4]
์ฌ๊ธฐ์ o
๋ object
์ ํ์
๋๊น? TypeScript๋ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค .....
'4' ์ ํ์ ํํ์์ '{}' ์ ํ์ ์ธ๋ฑ์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ํ '{}'.ts(7053)์ ์์ฑ '4'๊ฐ ์์ต๋๋ค.
@RDGthree ๋ Microsoft์ ๋ํ ๋ชจ๋ ๊ฒ์ ํ์ดํธ
strictNullChecks๋ฅผ ์ ์ธํ๊ณ ์ ํ ์์คํ ๋์์ ๋ณ๊ฒฝํ๋ ํ๋๊ทธ๊ฐ ์์ต๋๋ค. ํ๋๊ทธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ๋ณด๊ณ ๋ฅผ ํ์ฑํ/๋นํ์ฑํํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์กฐ๊ธ ํ์ RyanCavanaugh๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ค์ ๋ก ๋๊ตฐ๊ฐ๊ฐ ์ด ํ๋๊ทธ๋ก ์ด๋ค ์ด์ ์ ์ป์ ์ ์์์ง์ ๋ํด ๋งค์ฐ ํ์์ ์ ๋๋ค. ์ง๋ ๋ฐ ์ง๋์ ์ ์ฌํ ์ฌ๋ฌผ์ ์ด๋ฏธ ์ตํธ์ธ ๊ฐ๋ฅ | ์ ์ ์ฌ์ดํธ์์ ์ ์๋์ง ์๊ณ ์ด๋ ์ด ์ก์ธ์ค์ EULA์ ๊ฐ์ ๋์์ ์ ์ฉํ๋ ๊ฒ์ ์น๋ฆฌ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ง์๊ฒ ๋ง๋ค๊ธฐ ์ํด์๋ CFA์ ํ์ ๊ฐ๋๋ฅผ ์๋นํ ๊ฐ์ ํด์ผ ํ ๊ฒ์ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ค์ ๊น๋ฐ์ด ์๊ตฌ๋๊ณ ์๋ค๋ ์ฌ์ค์ ์๋ฒฝํ๊ฒ ์๊ณ ์์ผ๋ฉฐ, ์ง๊ธ๊น์ง ์ฌ๋๋ค์ด ์ด๊ฒ์ผ๋ก๋ถํฐ ์ป์ ์ ์๋ ๋ค์ ๋ชจํธํ ์ด์ต์ ์ํด ์ผํ ๊ฐ์น๊ฐ ์๋ค๊ณ ํ์ ํ์ง ๋ชปํ์ต๋๋ค. ์์งํ ๋งํด์ ๋๋ ๋๋์ง ์์ต๋๋ค. ์๋ํ๋ฉด ๋ชจ๋ ์ฌ๋๋ค์ด ์ด๋ฏธ ์ธ๊ธ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋๊ฐ์ ์ ์๊ณผ ์๋ฅผ ๊ฐ์ง๊ณ ๊ณ์ ์ฌ๊ธฐ์ ์ค๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด์์ ์ผ๋ก๋ for of
๋๋ ๋ฐฐ์ด์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ์ฒด ๋์ Map
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค(๋๋ ๋ ํจ๊ณผ์ ์ผ๋ก 'T | undefined' ๊ฐ์ฒด ๊ฐ).
๋๋ ์ธ๊ธฐ์๋ DT ํจํค์ง๋ฅผ ์ ์งํ๊ณ ์ฌ๋๋ค์ด http ํค๋ ๋งต๊ณผ ๊ฐ์ ํญ๋ชฉ์ |undefined
๋ฅผ ๊ณ์ ์ถ๊ฐํ๋๋ก ์์ฒญํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์์ต๋๋ค. ์ด๋ ๊ฑฐ์ ๋ชจ๋ ๊ธฐ์กด ์ฌ์ฉ์ ์ค๋จ์ํค๋ ๋นํธ๋ฅผ ์ ์ธํ๊ณ ์์ ํ ํฉ๋ฆฌ์ ์
๋๋ค. , ๊ทธ๋ฆฌ๊ณ Object.entries()
์ ๊ฐ์ ๋ค๋ฅธ ์์ ํ ์ฌ์ฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ ํจ์ฌ ๋ ๋์๊ฒ ๋ง๋ ๋ค๋ ์ฌ์ค. ๋น์ ์ ์๊ฒฌ์ด Typescript ์ ์์์ ์๊ฒฌ๋ณด๋ค ๋ซ๋ค๊ณ ๋ถํํ๋ ๊ฒ ์ธ์ ์ค์ ๋ก ์ฌ๊ธฐ์ ๊ธฐ์ฌํ ๊ฒ์ ๋ฌด์์
๋๊น?
Simon, ๋ด๊ฐ ๋น์ ์ ์๊ฒฌ์ ์๋ชป ์ฝ์์ ์๋ ์์ง๋ง ์๋ ์ ์์ ์ฐฌ์ฑํ๋ ์ฃผ์ฅ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. "๋ผ์คํธ ๋ง์ผ" ๋๋ฝ ๊ธฐ๋ฅ์ ์ปจํ
์คํธ์ ๋ฐ๋ผ ์์ฑ์ | undefined
๋ก ์ฒ๋ฆฌ ํ์ง๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ทธ๋์ #2521 upthread์ ๋ํ ๋น์ ๋ฅผ ๊ทธ๋ ธ์ต๋๋ค.
์ด์์ ์ธ ์๋๋ฆฌ์ค์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
ts
const arr: Array<T>;
const n: number;
const obj: {[k: K]: V};
const k: K;
๋๋ ์ด๋ป๊ฒ๋ ๋๋ผ ์ ์๋ค
arr[n]
์ ํ์ T | undefined
arr[n] = undefined
์(๋) ์ค๋ฅ์
๋๋ค.T | undefined
์๋ T
๋ก ์
๋ ฅ๋ ๊ฐ์ ์ ๊ณตํ๋ arr
์ ๋ํ ์ผ์ข
์ ๋ฐ๋ณต์ ์ก์ธ์คํ ์ ์์ต๋๋ค.obj[k]
์ ํ์ V | undefined
obj[k] = undefined
์(๋) ์ค๋ฅ์
๋๋ค.Object.entries()
๋ [K, V]
ํํ์ ์ ๊ณตํด์ผ ํ๋ฉฐ ์๋ฌด๊ฒ๋ ์ ์ํ ์ ์์ต๋๋ค.๋ด ๊ด์ ์์ ์ด ๋ฌธ์ ๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋ฌธ์ ์ ๋น๋์นญ์ ํน์ฑ์ ๋๋ค.
for ๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์์ ๋ฌธ์ ๋ผ๋ ๋ง์ Array Destructuring์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ฅผ ๊ณ ๋ คํ์ง ๋ชปํ ๊ฒ์ ๋๋ค. Typescript์์ ๊นจ์ ธ ์ด ๋ฌธ์ ๋ก ์ธํด ์์ ๋์ง ์์ต๋๋ค. ๋ถ์ ํํ ์ ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ์ํฅ์ ๋ฐ๋ IMO Array Destructuring์ ์ฌ์ ํ โโfor ๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํฐ ๋ฌธ์ ์ ๋๋ค.
const example = (args: string[]) => {
const [userID, duration, ...reason] = args
// userID and duration is AUTOMATICALLy inferred to be a string here.
// However, if for whatever reason args is an empty array
// userID is actually `undefined` and NOT a `string`.
// This is valid but it should not be because userID could be undefined
userID.toUpperCase()
}
๋ฌธ์ ์ ์๋ ์ง์ ์์ ๋๋ฌด ๋ฒ์ด๋๊ณ ์ถ์ง๋ ์์ง๋ง ํจ์ ์ธ์์ ํํ ์ ํ์ ์ฌ์ฉํ์ฌ ํด๋น ์์ ๋ฉ์๋๋ฅผ ์ค์ ๋ก ์ ์ธํด์ผ ํฉ๋๋ค. ํจ์๊ฐ ([userId, duration, ...reason]: [string, number, ...string[]]) => {}
๋ก ์ ์ธ๋ ๊ฒฝ์ฐ ์ฒ์์๋ ์ด์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
๋ด ๋ง์ ๊ทธ๋ฅ ๋์ง ์๋ ์์ง๋ง ์ค์ ๋ก๋ ํด๊ฒฐ์ฑ ์ด ์๋๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๊ธฐ ์๋ ์ฌ๋์ด๋ผ๋ฉด ๋๊ตฌ๋ for ๋ฃจํ ๋ฐฐ์ด ์ธ๋ฑ์ฑ์ ์บ์คํธํ์ฌ ์ด ์ ์ฒด ๋ฌธ์ ๋ฅผ ์์๊ฑฐํ ์ ์์ต๋๋ค.
for (let i = 0; i < array.length; i++) {
const value = array[i] as string | undefined
}
๋ฌธ์ ๋ Typescript๊ฐ ์ด ๋์์ ๋ํด ๊ฒฝ๊ณ ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ฐ๋ฐ์๋ก์ ์ฐ๋ฆฌ๋ ์๋์ผ๋ก ์ด๊ฒ์ ์ ์๋์ง ์์ ๊ฒ์ผ๋ก ์บ์คํ ํด์ผ ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ์์๊ฒ ๋ ๋ง์ ์์ ์ ์ ๋ฐํ๋ ๋๊ตฌ์ ๋ํ ๋์ ๋์์ ๋๋ค. ๋ํ ๊ณต์ ํ๊ธฐ ์ํด ์บ์คํธ๋ ์ค์ ๋ก ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
const example = (args: [string | undefined, string | undefined, ...string[] | ...undefined[]]) => {
}
์ ํ ์ข์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์์ ๋งํ๋ฏ์ด ์ฃผ์ ๋ฌธ์ ๋ ์ด๋ฐ ์์ผ๋ก ์ ๋ ฅํ ํ์์กฐ์ฐจ ์๋ค๋ ๊ฒ์ ๋๋ค. TS๋ ์ด์ ๋ํด ์ ํ ๊ฒฝ๊ณ ํ์ง ์์ต๋๋ค. ์ด๋ ์ฝ๋๋ฅผ ํธ์ํ๊ธฐ ์ํด ์ด๊ฒ์ ์์ด๋ฒ๋ฆฐ ๊ฐ๋ฐ์๋ก ์ด์ด์ง๋๋ค. ๋ฉ์ง CI๋ tsc ๋ณํฉ ๋ฐ ๋ฐฐํฌ์์ ๋ฌธ์ ๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค. TS๋ ์ฝ๋์ ๋ํ ํ์ ์ ์ฃผ๊ณ ๋ถ์ ํํ ์ ๋ ฅ์ด ์ ๊ณต๋๋ฉด ์๋ชป๋ ํ์ ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. => ๋ฐํ์ ์ค๋ฅ!
๊ทธ๊ฒ์ "์บ์คํธ"๊ฐ ์๋๋ฉฐ ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์
๋ ฅํ๋ ๊ฒ์
๋๋ค. ๋ด ์์ ์ ๋น์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐฉ๋ฒ์ ์
๋ ฅํ๋ฉด, (์ด์ ์๋ช
์์ ํ์ง๋ฅผ ํธ์ถ ํ ํ ์ฌ๋์ด์๋ค args: string[]
๊ทธ๋ค์ดํด์ผ๋๋ก๊ฐ ๋ณด์ฅํ์ง ์์ ๋) ์ง๊ธ, ์ปดํ์ผ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค ์ฌ๋ฐ๋ฅธ ์์ ์ธ์๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ฌ๋๋ค์ด ํ์ํ ๋ชจ๋ ์ธ์๋ฅผ ์ ๋ฌํ์ง ๋ชปํ๊ณ ์คํ ์๊ฐ์ ์ง์ ํ์ธํ๋๋ก ํ๊ณ ์ถ๋ค๋ฉด ์ค์ ๋ก (args: [string?, number?, ...string[]])
๋ก ์์ฑํ๋ ๊ฒ์ด ๋งค์ฐ ์ฝ์ต๋๋ค. ๊ทธ๊ฒ์ ์ด๋ฏธ ํ๋ฅญํ๊ฒ ์๋ํ๋ฉฐ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋จ์ง ๊ทธ ํจ์์์ ์ด ํจ์๋ฅผ ํธ์ถํ๋ ๋ค๋ฅธ ํจ์๋ก ๋ฌธ์ ๋ฅผ ์ด๋์ํฌ ๊ฒ์ ๋๋ค. ์ฌ์ ํ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ๋ฌธ์์ด์ ๋ณ๋์ ๊ฐ์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํ๋ฏ๋ก ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๋ฅผ ์ฌ์ฉํ์ฌ ์ด ํจ์๋ฅผ ํธ์ถํ๋ commandHandler ๋ด๋ถ์์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ฉด ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
Array Destructuring์ ๋ถ์ ํํ ์ ๋ ฅ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
๋ฌธ์ ์ ์๋ ์์ ์์ ๋๋ฌด ๋ฒ์ด๋๊ณ ์ถ์ง ์์ต๋๋ค.
์ฐธ๊ณ : ๊ทธ๊ฒ๋ค์ด ๋ณ๊ฐ์ ๋ฌธ์ ๋ก ๋ค๋ฃจ์ด์ ธ์ผ ํ๋ค๋ ๊ฒ์ ๋์ํ์ง๋ง, ๋๊ตฐ๊ฐ ์ด๋ ์ด ๊ตฌ์กฐ ํด์ฒด ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฌธ์ ๋ฅผ ์ด๋ฉด, ๊ทธ๊ฒ์ ๋ซํ๊ณ ์ฌ์ฉ์๋ ์ฌ๊ธฐ๋ก ์ ๋ฌ๋ฉ๋๋ค. #38259 #36635 #38287 etc... ๊ทธ๋์ ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด ๋ฌธ์ ์ ์ฃผ์ ์์ ๋ฒ์ด๋๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ๋ถ๋ง ์ค ์ผ๋ถ๋ | undefined
๋ฅผ ๊ฐ์ฒด ์ก์ธ์ค์์ ์ ์ถํ ์ ์๋ ํ์์ ์ ์ฉํ๋ ๋ช ๊ฐ์ง ๊ฐ๋จํ ๊ตฌ๋ฌธ์ผ๋ก ํด๊ฒฐ๋ฉ๋๋ค. ์:
const complexObject: { [key: string]: ComplexType } = { ... };
const maybeKey = 'two';
// From:
const maybeValue = complexObject[maybeKey] as
| (Some<Complex<Type>> & Pick<WithPlentyOf, 'Utility'> & Types)
| undefined;
// To:
const maybeValue2 = complexObject[maybeKey] as ?;
๋ฐ๋ผ์ ๋ ์๊ฒฉํ ์ ํ ๊ฒ์ฌ๋ ๊ณ์ ์ตํธ์ธ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ์๋๋ ์๋ํ์ง๋ง ๋ณต์ ๊ฐ ํ์ํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ๋น์ทํ ์์ ์๊ฐ์ ๋ ธ์ด์ฆ๊ฐ ๋น ๋ฅด๊ฒ ์ถ๊ฐ๋จ).
const maybeValue2 = complexObject[maybeKey] as
| typeof complexObject[typeof maybeKey]
| undefined;
๋๋ ์ด๋ฐ ์ข
๋ฅ์ "์๋ง๋ ํ์ ์ฃผ์ฅ" ๊ตฌ๋ฌธ( as ?
)์ด ์๋ก์ด ์ฌ์ฉ์์๊ฒ ๋งค์ฐ ํผ๋์ค๋ฝ์ง ์์ require-safe-index-signature-access
eslint ๊ท์น์ ๊ตฌํํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ์์ํฉ๋๋ค. (์: "๋ง์ง๋ง์ as ?
๋ฅผ ์ถ๊ฐํ์ฌ Lint ์ค๋ฅ๋ฅผ ์์ ํ ์ ์์ต๋๋ค.") ๊ท์น์๋ ์์ ํ ์๋ ์์ ํ๋ก๊ทธ๋จ์ด ํฌํจ๋ ์๋ ์์ต๋๋ค. ์ด๋ ๋ฐํ์ ๋ฌธ์ ๊ฐ ์๋ ์ปดํ์ผ ์ค๋จ๋ง ์ ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
function eh<T>(v: T): T | undefined {
return v;
}
const arr = [0, 1, 2, 3, 4, 5];
const thing1 = arr[1]; // number
const thing2 = eh(arr[1]); // number | undefined
๊ทธ๋๋ ์ด ๋๋ผ์ด TS ๊ธฐ๋ฅ ์ธ์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ ๊ฒ ๊ฐ์์ ใ ใ
function eh<T>(v: T): T | undefined { return v; } const arr = [0, 1, 2, 3, 4, 5]; const thing1 = arr[1]; // number const thing2 = eh(arr[1]); // number | undefined
์๋ตํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ๊ฐ์ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ์ด๋ค (๊ทธ๋ฆฌ๊ณ ๊ฑฐ์ ํ์ค ๋๋ถ๋ถ์ JS ์์ง์ ์ํด ๋ฉ๋ฆฌ ์ต์ ํ ๋ ๊ฒ์ด๋ค) ๋์, ๋๋ ์คํ๋ ค ์ฌ๋ถ์ ๊ตฌ๋ฌธ์ ์ก์ (์ธ๊ธ ํ ๋์ ๊ฒ
as ComplexType | undefined
) ์ปดํ์ผ JS ํ์ผ์ด ๋ฐฉ๋ฒ์ ์ ์งํด์ผ "๋ํผ ์ด์ " ์ด๋์๋ ์ฌ์ฉ๋ฉ๋๋ค.
๋ค๋ฅธ ๊ตฌ๋ฌธ ์ต์
(์์ as ?
๋ณด๋ค ์ฌ์ฉ ์ฌ๋ก์ ๋ ๊ตญํ๋จ)์ ์ ํ ์ด์ค์
์์ infer
ํค์๋๋ฅผ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ถ๋ ์ ํ์ ๋ํ ์๋ฆฌ ํ์์๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ์ฉํ๋ ๊ฒ์
๋๋ค. ์:
const maybeValue = complexObject[maybeKey] as infer | undefined;
ํ์ฌ infer
์ ์ธ์๋ง ํ์ฉ๋ฉ๋๋ค extends
์กฐ๊ฑด ์ ํ (์ ts(1338)
๊ทธ๋์ ์ ๊ณต) infer
์ ๋งฅ๋ฝ์์ ํค์๋ ์๋ฏธ๋ฅผ as [...]
์ ํ ์ด์ค์
์ ๊ฐ์ญํ์ง ์์ต๋๋ค.
eslint ๊ท์น์ ํตํด infer | undefined
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฌ์ ํ ํฉ๋ฆฌ์ ์ผ ์ ์์ง๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์ถฉ๋ถํ ์ผ๋ฐ์ ์
๋๋ค. ์๋ฅผ ๋ค์ด ๊ฒฐ๊ณผ ์ ํ์ด ์ ํธ๋ฆฌํฐ ์ ํ์ผ๋ก ์ธ๋ถํ๋ ์ ์๋ ๊ฒฝ์ฐ:
// Strange example, maybe from an unusual compiler originally written in JS:
if(someRegularExpression.test(maybeKey)) {
/**
* If we are inside this code block and this `maybeKey` exists on `partialObject`,
* we know its `regexSuccess` must also be defined, though this knowledge
* cannot be encoded using TypeScript's type system.
*/
const maybeValue = partialObject[maybeKey] as (Required<Pick<infer, 'regexSuccess'>> & infer) | undefined;
// ...
}
// Here we don't know if `regexSuccess` is defined on `maybeValue2`:
const maybevalue2 = partialObject[maybeKey] as infer | undefined;
function eh<T>(v: T): T | undefined { return v; } const arr = [0, 1, 2, 3, 4, 5]; const thing1 = arr[1]; // number const thing2 = eh(arr[1]); // number | undefined
์ด์จ๋ ๋ค๋ฅธ ์์ ํ ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ์ ๊ธฐ์ตํด์ผ ํ๋ค๋ฉด ์๋ฌด ์์ฉ์ด ์์ต๋๋ค. ์์ ์ ์ฐ๋ฆฌ๊ฐ ๋งค์ฐ ์ข์ ๋ ์ด๋ ํผ๊ณคํ๋ ์ฝ๋๋ฒ ์ด์ค์ ์ฒ์์ด๋ ์๊ด์์ด TypeScript๊ฐ ์ฐ๋ฆฌ๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ์ ํ์ฌ ๋์์ Array<string>[number]
์ ํ ํํ์์ด "์ซ์๋ก ๋ฐฐ์ด์ ์ธ๋ฑ์ฑํ ๋ ๋ฐ์ํ๋ ์ ํ"์ผ๋ก ํด์๋๋ค๋ ๊ฒ์
๋๋ค. ๋น์ ์ ์ธ ์ ์์ต๋๋ค
const t: Array<string>[number] = "hello";
const t: string
์(๋ฅผ) ์ฐ๋ ์ํ ๊ต์ฐจ๋ก ๋ฐฉ๋ฒ์ผ๋ก.
์ด ํ๋๊ทธ๊ฐ ์กด์ฌํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
Array<string>[number]
๊ฐ string | undefined
์ด๋ฉด ์ฐ๊ธฐ์ ๊ฑด์ ์ฑ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์
๋๋ค.
function write<T extends Array<unknown>>(arr: T, v: T[number]) {
arr[0] = v;
}
const arr = ["a", "b", "c"];
// Would be OK
write(arr, undefined);
Array<string>[number]
๊ฐ string
์ด๋ฉด ์ฝ๊ธฐ์์ ์ค๋ช
ํ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
function read<T extends Array<unknown>>(arr: T): T[number] {
return arr[14];
}
const arr = ["a", "b", "c"];
// Would be OK
const k: string = read(arr);
"์ธ๋ฑ์ค ์ฝ๊ธฐ ์ ํ"๊ณผ "์ธ๋ฑ์ค ์ฐ๊ธฐ ์ ํ" ๋ชจ๋์ ์ ํ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ฌด ๋ณต์กํด ๋ณด์ ๋๋ค. ์๊ฐ?
Array<string>[number]
์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด ํ๋๊ทธ๊ฐ ์ ์ธ ํ์ผ์ ํด์์ ๋ณ๊ฒฝํจ์ ์๋ฏธํ๋ฏ๋ก ์ค์ ๋ก ๋ฌธ์ ๊ฐ ์์์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์๋นํ ์์ ์ฌ๋๋ค์ด ํ์ฑํํ ์ ์๋ ์ผ์ข
์ ํ๋๊ทธ์ฒ๋ผ ๋ณด์ด์ง๋ง ํ์คํ ์ ํ์ด ์ง์ ๋ ํญ๋ชฉ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋ฐ์ํ์ง ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ์ด ์ฐ์
๋๋ค. ์๋ฐฉํฅ์ผ๋ก ๊น๋ํ๊ฒ ์ด ๋์์ผ๋ก ์ถ๊ฐํ ์ ์๋ ํ๋๊ทธ์ ์๋ ๋ถ๋ช
ํ ๊ทน๋๋ก ์์ผ๋ฏ๋ก(๋ชจ๋ ์ ํ ํจํค์ง์ 64๊ฐ์ง ๋ค๋ฅธ ๊ตฌ์ฑ์ CI ํ
์คํธํ ์ ์์) Array<T>[number]
๋ฅผ T
์ผ๋ก ๋จ๊ฒจ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค
๊ทํ์ ์์์ @RyanCavanaugh write(arr, undefined)
, ํธ์ถ write
์ธ์ ๋ ์ ์์ง๋ง ๊ฒ์๋ ํ ๋น arr[0] = v;
๋ ์ด์ ์ปดํ์ผ?
์์ write
ํจ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณต๋๊ณ ํ๋๊ทธ ์์ด ์ปดํ์ผ๋ JS์ธ ๊ฒฝ์ฐ์๋ ํ์คํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ํํ ํ๋๊ทธ๋ก ์ปดํ์ผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ์กด์ฌํ๋ ๋ฌธ์ ์
๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ฒฉํ null ๊ฒ์ฌ ์์ด ์ปดํ์ผ๋ ๊ฒฝ์ฐ ํด๋น ํจ์๋ string
๋ฐํํ ์ ์์ง๋ง ์ค์ ๋ก๋ string|undefined
๋ฐํํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ฆ ๋๋ถ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ null ๊ฒ์ฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ๋๋ค์ด ๋ถํํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ์ ํ๋๊ทธ๊ฐ ์กด์ฌํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์์ํ๊ณ ๊ฒฐ๊ตญ ๋๋ถ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด ํ๋๊ทธ๊ฐ ์ค์ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ํ ๋จธ๋ฆฌ ์์์ ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ์ฐพ์ ์ ์์ง๋ง ๋ด ์ฑ์ ์ปดํ์ผํ๋ ค๋ฉด skipLibCheck
๋ฅผ ์ค์ ํด์ผ ํ์ต๋๋ค. ์๋ก์ด TS ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ค ๋๋ง๋ค ์์ฉ๊ตฌ์ ํ์ค tsconfig ์ต์
์
๋๋ค. ๋ฌธ์ ๊ฐ ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ฐ์ธ์ ์ผ๋ก(์๋ง๋ ์ด๊ธฐ์ ์ผ๋ก), _my_ ์ฝ๋๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ ์์ ํด์ง๋ค๋ฉด ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์ ํ๊ฒฉ์ ๋ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค๋ฅธ ๊ฒฝ์ฐ๋ณด๋ค ๋ ์์ฃผ ์ธ๋ฑ์ค๋ก ๋ฐฐ์ด์ ์ก์ธ์คํ ๋ ๋ ํฌ์ธํฐ์ ๋ถ๋ชํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ ํ ์ ์์ต๋๋ค.
๋ฐฐ์ด์ธ ๊ฒฝ์ฐ
[์ซ์]๋ ๋ฌธ์์ด์ ๋๋ค | ์ ์๋์ง ์์ ๊ฒฝ์ฐ ์ฐ๊ธฐ์ ๊ฑด์ ์ฑ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ ์๊ฐ์๋ Array<string>[number]
๋ ํญ์ string|undefined
์ด์ด์ผ ํฉ๋๋ค. ์ซ์๊ฐ ์๋ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ๋ฉด ๋ฐฐ์ด์ ํญ๋ชฉ ์ ํ ๋๋ ์ ์๋์ง ์์ ํญ๋ชฉ์ด ํ์๋๋ ๊ฒ์ด ํ์ค์
๋๋ค. ํํ๋ก ํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ฐฐ์ด ๊ธธ์ด๋ฅผ ์ธ์ฝ๋ฉํ์ง ์๋ ํ ์ค์ ๋ก ๋ ๊ตฌ์ฒด์ ์ผ ์ ์์ต๋๋ค. string|undefined
๋ฅผ ๋ฐฐ์ด ์ธ๋ฑ์ค์ ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฑ ์์ ๋ ์ ํ ๊ฒ์ฌ๊ฐ ์๋๋๋ค.
"์ธ๋ฑ์ค ์ฝ๊ธฐ ์ ํ"๊ณผ "์ธ๋ฑ์ค ์ฐ๊ธฐ ์ ํ" ๋ชจ๋์ ์ ํ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ฌด ๋ณต์กํด ๋ณด์ ๋๋ค. ์๊ฐ?
์ด๊ฒ์ ๋ ๊ฐ์ง๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ํํ ๋ฌด์์ด์ด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐฐ์ด์๋ ์ ์๋ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฏ๋ก ํญ์ ์ ์๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. Array<string>[number]
์ ์ ํ์ string|undefined
์
๋๋ค. ๋น์ ์ด ์ํ๋ ๊ฒ์ ์ง์ ํ๋ ค๋ฉด T
์์ Array<T>
, ์ ํธ๋ฆฌํฐ ์ ํ์ด ์ฌ์ฉ๋ ์๋ฅผ (์๋์ง ๋ช
๋ช
) : ArrayItemType<Array<string>> = string
. ์ด๊ฒ์ RecordValue<Record<string, number>, string> = string
์ ๊ฐ์ ๊ฒ์ด ํ์ํ ์ ์๋ Record
์ ํ์๋ ๋์์ด ๋์ง ์์ต๋๋ค.
์ฌ๊ธฐ์๋ ํ๋ฅญํ ์๋ฃจ์ ์ด ์๋ค๋ ๋ฐ ๋์ํ์ง๋ง ์ธ๋ฑ์ค ์ฝ๊ธฐ์ ๊ฑด์ ํจ์ ์ ํธํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
๋ค๋ฅธ ๋ง์ ์ธ์ด(Rust์ ๊ฐ์ "์์ ํ" ์ธ์ด๋ฅผ ํฌํจํ์ฌ)๋ ๊ฒฝ๊ณ ๊ฒ์ฌ์ ๋ํ ์ฑ
์์ ์ฌ์ฉ์์๊ฒ ๋งก๊ธฐ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์์ ์ด๊ฒ์ด ํ์ํ๋ค๊ณ ํน๋ณํ ๊ฐํ๊ฒ ๋๋ผ์ง๋ ์์ต๋๋ค. . ๋ํ ์ด ๊ตฌ๋ฌธ์ foo[i]
์ ๊ฐ์ ๋๊ดํธ ํ๊ธฐ๋ฒ์ _ํญ์_ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ฒฝ์ฐ์ ๋งค์ฐ ๋ช
ํํ๊ฒ ๋ง๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์ฆ, foo.bar
์ ์๋ช
์ด ์ฌ๋ฐ๋ฅธ์ง ์ฌ๋ถ๋ฅผ ๋งํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์(๋ช
์์ ์ผ๋ก ์ ์๋ bar
ํ๋๋ก ์ธํด) ๋ฌธ์์ด ์ธ๋ฑ์ฑ๋ ๊ฐ์ฒด์ ์ด๊ฒ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ํด ๊ฐํ๊ฒ ์๊ฐํฉ๋๋ค. ๋๋ undefined
(์์ธ ์๋ช
์ ์ผ๋ถ์ด๊ธฐ ๋๋ฌธ์). ์ด ๊ฒฝ์ฐ(๊ฐ์น๊ฐ ๋งค์ฐ ๋๋ค๊ณ ์๊ฐํจ)๊ฐ ํด๊ฒฐ๋๋ฉด ์ด๋ ์ด ์ฌ๋ก๊ฐ ํ์ฐฎ์์ง๊ณ ์๋ง๋ ํ ๊ฐ์น๊ฐ ์์ ๊ฒ์
๋๋ค.
"์ธ๋ฑ์ค ์ฝ๊ธฐ ์ ํ"๊ณผ "์ธ๋ฑ์ค ์ฐ๊ธฐ ์ ํ" ๋ชจ๋์ ์ ํ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ฌด ๋ณต์กํด ๋ณด์ ๋๋ค. ์๊ฐ?
์๋ฐ์คํฌ๋ฆฝํธ์ getter ๋ฐ setter ๊ตฌ๋ฌธ์ ์ ํ ์ ์๋ก ํ์ฅํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๊ตฌ๋ฌธ์ TypeScript์์ ์์ ํ ์ดํด๋ฉ๋๋ค.
const foo = {
_bar: "",
get bar(): string {
return this._bar;
},
set bar(value: string) {
this._bar = value;
}
}
๊ทธ๋ฌ๋ TS๋ ํ์ฌ ํ๋์ "get" ๋ฐ "set" ์ ํ์ ๋ณ๋๋ก ์ถ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋จ์ผ ์ ํ์ผ๋ก ์ด๋ค์ "๋ณํฉ"ํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ์๋ํ์ง๋ง getter์ setter๊ฐ ๋์ผํ ์ ํ์ ๊ณต์ ํด์ผ ํ๊ณ setter๋ง ์ ์ํ๋ ํ๋์ getter ์ ํ์ ์๋ชป ํ ๋นํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ณ ์ ํ ๋จ์ ์ด ์์ต๋๋ค.
TS๊ฐ ๋ชจ๋ ํ๋(์ค์ ์ฑ๋ฅ ๋น์ฉ์ด ์์ ์ ์์)์ ๋ํด "get" ๋ฐ "set"์ ๋ณ๋๋ก ์ถ์ ํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๋จ์ ์ ํด๊ฒฐํ๊ณ ์ด ๋ฌธ์ ์ ์ค๋ช ๋ ๊ธฐ๋ฅ์ ์ค๋ช ํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ๋ ์ ๊ณตํฉ๋๋ค.
type foo = {
[key: string]: string
}
๋ณธ์ง์ ์ผ๋ก ๋ค์์ ์ฝ์ด๊ฐ ๋ฉ๋๋ค.
type foo = {
get [key: string](): string | undefined;
set [key: string](string): string;
}
Array์ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ถ๊ฐํด์ผํฉ๋๋ค.
[์ซ์]๋ ์ด ํ๋๊ทธ๊ฐ ์ ์ธ ํ์ผ์ ํด์์ ๋ณ๊ฒฝํจ์ ์๋ฏธํ๋ฏ๋ก ์ ๋ง ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
์์ฑ๋ ์ ์ธ ํ์ผ์ด ํญ์ ์์ ํ getter+setter ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ค๋ฉด, ์ด๊ฒ์ _only_ ์์ผ๋ก ์ด ๊ฒ์ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์
๋๋ค. ํ์ฌ ๊ท์น์ ์ ์ ํ์ผ์๋ง ์๋ ๋๋จธ์ง ์ฝ์ ๊ตฌ๋ฌธ์ ์ ์ฉํ๋ ๊ฒ์ด ์ฌ๊ธฐ์์ ํด๊ฒฐ์ฑ
์ด ๋ ์ ์์ต๋๋ค. ํ์คํ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง .ts
ํ์ผ๊ณผ .d.ts
ํ์ผ์ ์ฝ๋ ์ ์ ์ ๋น์ฉ๋ ์ถ๊ฐ๋ฉ๋๋ค.
๊ณ์:
๋ฌผ๋ก ์ด๊ฒ์ getter/setter์ _๋ชจ๋ _ ๋ฏธ๋ฌํ ๊ฒฝ๊ณ ๋ฅผ ๋ค๋ฃจ์ง ์์ต๋๋ค.
foo.bar = "hello"
// TS assumes that bar is now a string, which technically isn't guaranteed when
// custom setters and getters are used.
const result: string = foo.bar
์ด๊ฒ์ ๋ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์ด๋ฉฐ TS ๋ชฉํ์ ๋ฒ์ ๋ด์ ์๋์ง ๊ณ ๋ คํด ๋ณผ ๊ฐ์น๊ฐ ์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์์ ์ ์ํ ๋ด์ฉ์ด TypeScript์ ํ์ฌ ๋์๊ณผ ์ผ์นํ๊ธฐ ๋๋ฌธ์ ์ด๋ ์ชฝ์ด๋ ๋ณ๋๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋๊ธ์ ๋ชจ๋ ํ์ด์ง์ ํ์ ์ ํ์ํ๊ณ #2521์ ๋ํ ๋งํฌ๋ฅผ ๋ค์ ๋๋กญํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
"์ธ๋ฑ์ค ์ฝ๊ธฐ ์ ํ"๊ณผ "์ธ๋ฑ์ค ์ฐ๊ธฐ ์ ํ" ๋ชจ๋์ ์ ํ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ฌด ๋ณต์กํด ๋ณด์ ๋๋ค. ์๊ฐ?
์๋์! ๊ทธ๋ฆฌ๊ณ ์ ์ด๋ (๋งํฌ ํด๋ฆญ...) ์ฌ๊ธฐ์ ์๋ 116๋ช ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋์ ๋์ํฉ๋๋ค. ์ ์ด๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ฅผ ๋ค๋ฅด๊ฒ ์ ๋ ฅํ ์ ์๋ ์ต์ ์ด ์์ผ๋ฉด ์ ๋ง ๊ธฐ์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ํด๋น ๊ธฐ๋ฅ์ ๋ ๋ค๋ฅธ ํ๋ฅญํ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
์ ์ด๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ฅผ ๋ค๋ฅด๊ฒ ์ ๋ ฅํ ์ ์๋ ์ต์ ์ด ์์ผ๋ฉด _๋๋ฌด ๊ธฐ์ฉ๋๋ค_. ์ด๊ฒ์ ๊ทธ ๊ธฐ๋ฅ์ ๋ํ _๋ ๋ค๋ฅธ_ ํ๋ฅญํ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
๋๋ ์๋๊ฐ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์ ํ์ ์ฐธ์กฐํ๋ ๋ฐฉ๋ฒ์ด ์์ด์ผ ํ๋์ง ์ง๋ฌธํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฐ๊ธฐ ์ ํ์ ์ฐธ์กฐํ๊ธฐ ์ํด Array<string>[number]=
์ ๊ฐ์ ๊ฒ์ด ์์ด์ผ ํฉ๋๊น?
๋ ๊ฐ์ง ์ผ์ด ๋ฐ์ํ๋ฉด #2521๊ณผ ์ด ๋ฌธ์ ์ ํด๊ฒฐ์ ๋ง์กฑํ ๊ฒ์ ๋๋ค.
Array<string>[number]
์ "์ฐ๊ธฐ ์ ํ"์ด string
์ด๊ณ "์ฝ๊ธฐ ์ ํ"์ด string | undefined
๊ฐ ๋๋๋ก ์ด ๋ฌธ์ ์์ ์ค๋ช
ํ ๋๋ก ํ๋๊ทธ๋ฅผ ๋ง๋ญ๋๋ค.๋๋ (์ค์๋ก?) ์ ์๊ฐ ํ์์ ๊ธฐ์ด๋ฅผ ๋์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค( https://github.com/microsoft/TypeScript/issues/13778#issuecomment -630770947 ์ฐธ์กฐ). "์ฐ๊ธฐ ์ ํ"์ ์ง์ ์ ์ํ๊ธฐ ์ํด ๋ช ์์ ๊ตฌ๋ฌธ์ด ํน๋ณํ ํ์ํ์ง๋ ์์ต๋๋ค.
@RyanCavanaugh ๋น ๋ฅธ ๋ฉํ ์ง๋ฌธ: ๊ฐ์ /์ฝ์ /๋น์ฉ์ ๋ณด๋ค ๋ช ํํ๊ฒ ๋ ผ์ํ๊ณ ์ถ์ ํ๊ธฐ ์ํด ์์ ๋ค์ ๊ตฌ์ฒด์ ์ธ ์ ์์ ๋ณ๋์ ๋ฌธ์ ๋ก ๊ฐ๋
@RyanCavanaugh
const t: Array<string>[number] = "hello";
const t: string
์(๋ฅผ) ์ฐ๋ ์ํ ๊ต์ฐจ๋ก ๋ฐฉ์์ผ๋ก.
์ด๊ฒ์ด ํํ์ ๋ํ ๋์ผํ ์ถ๋ก ์ด๋ผ๊ณ ์๊ฐํฉ๋๊น?
const t : [string][number] = 'hello' // const t: string
๊ทธ๋ฌ๋ ํํ์ ๊ฒฝ๊ณ๋ฅผ ์ธ์ํ๊ณ ๋ ๊ตฌ์ฒด์ ์ธ ์ซ์ ์ ํ์ ๋ํด undefined
๋ฅผ ์ ์ ํ๊ฒ ๋ฐํํฉ๋๋ค.
const t0: [string][0] = 'hello' // ok
const t1: [string][1] = 'hello' // Type '"hello"' is not assignable to type 'undefined'.
// therefore this is already true!
const t2: [string][0|1] // string | undefined
number
์ ํ์ด ๋ค๋ฅด๊ฒ ์๋ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์ด๋ฅผ ์ํํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. https://github.com/microsoft/TypeScript/issues/38779
์ด๊ฒ์ ์ถ๊ฐ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ๋ ๋ด ์๊ตฌ๋ฅผ ์ถฉ์กฑ์ํฌ ๊ฒ์ ๋๋ค.
๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋ ์ ์๋๋ก ์์ ํ์ง ์์ ๋ฐฐ์ด ์ก์ธ์ค ๋ฐ ๋ฐฐ์ด/๊ฐ์ฒด ๊ตฌ์กฐํ์ ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ ESLint ํ๋ฌ๊ทธ์ธ์ด ์์ต๋๋ค. ํํ ๋ฐ (๋น ๋ ์ฝ๋) ๊ฐ์ฒด์ ๊ฐ์ ์์ ํ ์ฌ์ฉ์ ํ๋๊ทธ๋ฅผ ์ง์ ํ์ง ์์ต๋๋ค.
https://github.com/danielnixon/eslint-plugin-total-functions
๊ฑด๋ฐฐ, ํ์ง๋ง ์์ ํ ํ์ ๊ฒ์ฌ์ ์์ญ์ ์ํ๊ณ ์ผ๋ถ ํ๋ก์ ํธ์๋ ๋ฆฐํฐ๋ ์ฌ๋ฐ๋ฅธ ๊ท์น์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ฌ์ ํ ์ธ์ด ์์ค์์ ์ถ๊ฐ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด ๋ถ๋ช ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@RyanCavanaugh
์ฐ๋ฆฌ๋ ๋ํ ์ด ๊ธฐ๋ฅ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ๋ณด์ด๋์ง ํ ์คํธํ์ผ๋ฉฐ ์๋ฆ๋ต์ง ์๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
๊ทธ๋ฅ ๊ถ๊ธํด์์. ์์์ง ์์ ๋ถ๋ถ์ด ๋ฌด์์ธ์ง ์๋ ค์ฃผ์ค ์ ์๋์? ์ด์ ๋ํด ๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ณต์ ํด ์ฃผ์๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ต์ ์ด ์๋๋ผ ๊ธฐ๋ณธ๊ฐ ์ด์ด์ผ ํฉ๋๋ค.
์ฆ, TypeScript์ ์ ํ ์์คํ ์ด ์ปดํ์ผ ์๊ฐ์ JavaScript ๊ฐ์ด ๋ฐํ์์ ์ทจํ ์ ์๋ ์ ํ์ ์ค๋ช ํ๋ ๊ฒฝ์ฐ:
Array
์ธ๋ฑ์ฑ์ ๋ฌผ๋ก JavaScript์์ undefined
๋ฅผ ๋ฐํํ ์ ์์ผ๋ฏ๋ก(๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ธ๋ฑ์ค ๋๋ ํฌ์ ๋ฐฐ์ด) ์ฌ๋ฐ๋ฅธ ์ฝ๊ธฐ ์๋ช
์ T | undefined
์
๋๋ค.Array
๋ undefined
๋น์๋ ๊ฐ๋ฅํ๋ค delete
ํค์๋.TypeScript 4๊ฐ ๋ฐฉ์งํ๋ฏ๋ก
const a = [1, 2]
delete a[1]
a[1] = undefined
๋ ๋ฐฉ์งํ๋ ์ข์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ Array<T>[number]
๊ฐ ์ฝ๊ธฐ์ ์ฐ๊ธฐ์ ๋ํด ์ค์ ๋ก ๋ฌ๋ผ์ผ ํจ์ ์์ฌํฉ๋๋ค.
"๋ณต์ก"ํ ์ ์์ง๋ง JavaScript์์ ๋ฐํ์ ๊ฐ๋ฅ์ฑ์ ๋ณด๋ค ์ ํํ๊ฒ ๋ชจ๋ธ๋งํ ์ ์์ต๋๋ค.
TypeScript๋ ๋ฌด์์ ์ํด ๋ง๋ค์ด์ก์ต๋๊น?
| undefined
๊ฐ ๊ธฐ๋ณธ ๋์์ ๋ฐํํ๋๋ก ํ๋ ์์ด๋์ด๋ฅผ ๋
ผ์ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ ์
๋ฐ์ดํธ๋ก ์ธํด ์๋ฐฑ๋ง ์ค์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ํญ๋ฐ์ํค๋ Typescript ๋ฒ์ ์ ์ถ์ ํ์ง ์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๋ณํ๋ ๋ด๊ฐ ๋ฐ๋๋ ์ด๋ค ํ๋ก์ ํธ์์๋ ๊ฐ์ฅ ํ๊ธฐ์ ์ธ ๋ณํ๊ฐ ๋ ๊ฒ์
๋๋ค.
๊ทธ๋๋ ๋๋จธ์ง ๊ธ์๋ ๋์ํฉ๋๋ค.
| undefined
๊ฐ ๊ธฐ๋ณธ ๋์์ ๋ฐํํ๋๋ก ํ๋ ์์ด๋์ด์ ๋ํด ๋ ผ์ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ ์ ๋ฐ์ดํธ๋ก ์ธํด ์๋ฐฑ๋ง ์ค์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ํญ๋ฐ์ํค๋ Typescript ๋ฒ์ ์ _์ ๋_ ์ถ์ํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ณํ๋ ๋ด๊ฐ ๋ฐ๋๋ ์ด๋ค ํ๋ก์ ํธ์์๋ ๊ฐ์ฅ ํ๊ธฐ์ ์ธ ๋ณํ๊ฐ ๋ ๊ฒ์ ๋๋ค.๊ทธ๋๋ ๋๋จธ์ง ๊ธ์๋ ๋์ํฉ๋๋ค.
๊ตฌ์ฑ ์ต์ ์ธ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๊ตฌ์ฑ ์ต์ ์ธ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ ๊ณตํํ์ง๋ง ์ต์ํ ๊ธฐ๋ณธ์ ์ผ๋ก ๊บผ์ ธ ์๋ ๊ธด "๋ฆฌ๋ ์ธ" ๊ธฐ๊ฐ์ ์์ํ์ฌ ์ฌ๋๋ค์๊ฒ ๋ ๊ฑฐ์ ์ฝ๋๊ฐ ํ์ฑํ๋๊ธฐ ์ ์ ๋ณํํ๋ ๋ฐ ๋ง์ ์๊ฐ(6๊ฐ์? 1๋ ? ๊ทธ ์ด์?)์ ์ค ๊ฒ์ ๋๋ค. -๊ธฐ๋ณธ. ์๋ฅผ ๋ค์ด v4.0์ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๊ณ v5.0์์ ๊ธฐ๋ณธ์ ์ผ๋ก on์ผ๋ก ์ค์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋จผ ๋ฏธ๋์ ๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ ์ ์ ์กฐ๊ฑด ๊ธฐ๋ฅ(setter/getter์ ๋ํด ๋ค๋ฅธ ์ ํ)์ด ํ ๊ฐ์น๊ฐ ์๋ค๋ ๋์์กฐ์ฐจ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ ์ ๋ ๊ธฐ๋ณธ ๋์์ ๋ํด ์ค๋ซ๋์ ๋ ผ์ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค๋ ์ง์ ์ ์ง์งํฉ๋๋ค.
| undefined
๊ฐ ๊ธฐ๋ณธ ๋์์ ๋ฐํํ๋๋ก ํ๋ ์์ด๋์ด์ ๋ํด ๋ ผ์ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ ์ ๋ฐ์ดํธ๋ก ์ธํด ์๋ฐฑ๋ง ์ค์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ํญ๋ฐ์ํค๋ Typescript ๋ฒ์ ์ _์ ๋_ ์ถ์ํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ณํ๋ ๋ด๊ฐ ๋ฐ๋๋ ์ด๋ค ํ๋ก์ ํธ์์๋ ๊ฐ์ฅ ํ๊ธฐ์ ์ธ ๋ณํ๊ฐ ๋ ๊ฒ์ ๋๋ค.๊ทธ๋๋ ๋๋จธ์ง ๊ธ์๋ ๋์ํฉ๋๋ค.
@thw0rted ์์ ๊น์ง ์ฌ๊ธฐ์์ ํํ์ ์ ์ํ์ต๋๋ค. https://github.com/microsoft/TypeScript/issues/38779
ํจ์ฌ ๋์ค์ ๋์ ๋ ๊ธฐ๋ฅ์์ ์ฌ์ ํ ๋๋ฆฌ ์ฌ์ฉ๋์ง ์๋ ์ด ๊ธฐ๋ฅ์ ํ์ฉํ๊ณ ์ด๋ฏธ "๊ฑฐ์" ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ์ฝ๊ฐ์ ๋ณ๊ฒฝ๋ง ํ์ํฉ๋๋ค.
"strict"
์ผ๊ด์ฑ์ ์ํด Array<T>
๋ "a list of type T that is infinitly long with no gaps"
๋ก ๊ฐ์ฃผ๋์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ์ํ์ง ์์ ๋๋ง๋ค ํํ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ค, ์ฌ๊ธฐ์๋ ๋จ์ ์ด ์์ต๋๋ค. ํ์ง๋ง ๋ค์ ํ ๋ฒ ์ ๋ ์ด ๊ธฐ๋ฅ์ด ์ฌ๊ธฐ์์ ์์ฒญํ ๋๋ก ์ ํํ ๊ตฌํ ๋ฐ ๊ตฌํ๋์ง ์๋ ๊ฒ์ด ๊ณต์ ํ "ํํ"์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋์ํ์๋ฉด ํฌํํด์ฃผ์ธ์
๋๋ ์ด๊ฒ์ด ์์ ํ ์๋ก์ด ์ต์ /๊ตฌ์ฑ์ด ํ์ํ๋ค๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค.
์๊ฒฉํ ์ต์ ์ด ๋นํ์ฑํ๋์ด ์์ ๋ ๊ธฐ๋ณธ ๋์์ด ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง ์๊ฒฉํ ์ต์ ์ธ BE STRICT๋ฅผ ํ์ฑํํ๊ณ ์ด์ ํ๋ก์ ํธ์์๋ ์ด๋ฅผ ์ ์ฉํ๋ฉด ๊ธฐ๋ณธ ๋์์ด ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์๊ฒฉํจ์ ํ์ฑํํ๋ ๊ฒ์ ์ฌ๋๋ค์ด ๊ฐ๋ฅํ ๊ฐ์ฅ ์๊ฒฉํ๊ณ ์ ํํ ํ์ดํ์ ์ ํํ๋ ๊ฒ์ ๋๋ค. ์๊ฒฉํ ์ต์ ์ ํ์ฑํํ๋ฉด ๋ด ์ฝ๋์ ํ์ ์ ๊ฐ๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ด TS์ ๊ฐ์ฅ ์ข์ ๋ถ๋ถ์ ๋๋ค. ๊ทธ๋ฌ๋ ์๊ฒฉํ๊ฒ ํ์ฑํ๋ ๊ฒฝ์ฐ์๋ ์ด๋ฌํ ๋ถ์ ํํ ์ ๋ ฅ์ ๊ณจ์น ์ํ ์ผ์ ๋๋ค.
์ด ์ค๋ ๋๋ฅผ ์ฝ์ ์ ์๋๋ก ์ ์งํ๊ธฐ ์ํด ๋ํ์ ์๋ฏธ ์๊ฒ ์ถ๊ฐ๋์ง ์์ ์ฌ๋ฌ ์ ์ ๋๊ธ์ ์จ๊ฒผ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ๋งฅ๋ฝ์ ์ฃผ์์ ์ด์ 212๊ฐ์ ์ฃผ์์์ ์ด์ ์ ์์ฑ๋์์ผ๋ฉฐ ๋ฐ๋ณตํ ํ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์์ ํด๊ฒฐํด์ผ ํ ๋งค์ฐ ์ค์ ์ ์ด๊ณ ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ์ด ์ค๋ ๋์์ ์๋ฏธ ์๋ ์์
์ ์ํํ ์ ์๋ค๋ ๊ฒ์ ์ค๋ง์ค๋ฝ์ต๋๋ค. ํ๋๊ทธ ๋ค์ ์๋ ๋ชจ๋ ๊ฒ์ด ์ค์ ๊ฒฐ๊ณผ๊ฐ ์๊ฑฐ๋ be ts-ignore
'd๋ ์
๊ทธ๋ ์ด๋ ๋ถ๋ด์ด ์๋๋๋ค.
@RyanCavanaugh
์์ฝํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ ๋ก ์๋ ๋ณํ๋ฅผ ์นํธํ๊ธฐ ์ํด ์ฌ๊ธฐ์ ์ค๊ธฐ ์ ์ ํ๋ก์ ํธ์ ์ฅ๊ธฐ ์ค๊ณ ๋ชฉํ์ ๋ ๋ง์ด ์ฐธ์ฌํ์ญ์์ค.
๋๋ ๋ด ๋๊ธ์ ์ง์ ๊ณ ์ํ์๋ฉด ์ด ๋๊ธ๋ ์ญ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก์ ํธ์ ์ฒซ ๋ฒ์งธ ๋ชฉํ๋ฅผ ์ดํดํ๋ ๋ฐฉ๋ฒ:
1. ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ตฌ์ฑ์ ์ ์ ์ผ๋ก ์๋ณํฉ๋๋ค.
(์ถ์ฒ: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals )
ํ์ธ๋์ง ์์ ์ธ๋ฑ์ค ์ก์ธ์ค๋ก ์ธํด ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ธ์ฉ๋ ์๊ฒฌ์ ์ดํดํ ์ ์์ต๋๋ค. JavaScript์์ ๊ทธ๋ฐ ๊ฒ์ ๊ธฐ๋ํ๋ค๋ฉด TypeScript์์๋ ์ํํ๊ณ ์๋ชป๋ ํ์ ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ์๋ชป๋ ์ ํ์ any
๋ณด๋ค ๋์ฉ๋๋ค.
๊ธ์, ์ด์ ๋น์ ์ด ๊ทธ๋ ๊ฒ ๋งํ์ผ๋ฏ๋ก ๋๋ ํ์ ํฉ๋๋ค.
๋ฌผ๋ก ๋น์ ์ ํต์ฌ ๋ฉ์ธํ ์ด๋ ์ค ํ๋์ด๋ฉฐ ts์ ๋ํ ํ๊ณผ ๊ธฐ์ฌ์์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํ์ง๋ง ๋ ์ด์ ๋น์ ๋ง์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์ฐฌ์ฑ: 365์ ๋ฐ๋: 6์ ๋น๊ตํ์ธ์! ๋จ 6! ์ ํ ์์ ์ฑ์ ๋ํ ์์ฒญ๋ ์๊ตฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๊ทธ๋ฌ๋ ํด๊ฒฐ์ฑ ์ ๋ํด ์ด์ผ๊ธฐํฉ์๋ค. ํ์ด ๋ง๋ค๊ฑฐ๋ ์๊ฐํ ์ ์๋ ์๋ฃจ์ ์ด ์์ต๋๊น?
์ด ๊ฒฝ์ฐ ts-ignore
๋ฌธ์ ์ ์ ๋ํด ์ข ๋ ์์ธํ ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น? codemod ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํํ ์ ์์ผ๋ฉฐ ํ์ฌ ์ฝ๋์ ๋์์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ๋ฌผ๋ก ์๋ฆ๋ค์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋์ง๋ง ํ๋๊ทธ ์์ด ์ด ๋ณ๊ฒฝ ์ฌํญ์ ๋์
ํ ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค.
์๋ฅผ ๋ค์ด 4.0.0-breaking
์ ๊ฐ์ด ํจ์น๋ ts ๋ฒ์ ์ ์๋ ๊ฒ์์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? ์ถฉ๋์ ๋ํ ๋ช ๊ฐ์ง(๋ง์?) ์์
์ ์๊ฐํ์ง๋ง ๋ชจ๋ ์ฌ๋์ด ๋ณ๊ฒฝ ์ฌํญ์ ํ
์คํธํ๊ณ ์ฝ๋ ๊ธฐ๋ฐ์ ์ค๋นํ ์ ์์ต๋๋ค(์ด ๊ธฐ๋ฅ ์์ฒญ๋ฟ๋ง ์๋๋ผ). ์ด๊ฒ์ 3-6๊ฐ์๊ณผ ๊ฐ์ ์ ํ๋ ๊ธฐ๊ฐ ๋์ ์ํ๋ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๋ฒ์ ์ ์ฌ์ฉํ ์ฒซ ๋ฒ์งธ ์ฌ๋์ด ๋ ๊ฒ์
๋๋ค.
๋ ์ด์. ์ฐฌ์ฑ: 365์ ๋ฐ๋: 6์ ๋น๊ตํ์ธ์! ๋จ 6! ์ ํ ์์ ์ฑ์ ๋ํ ์์ฒญ๋ ์๊ตฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- @๋ฒ ์๋ ธํ
ใ
.
@RyanCavanaugh ์ ์ ์ฒด ๊ฒ์๋ฌผ์ ๋์ํ๋
์๋ฐฑ๋ง์ด ์์ต๋๊น? ๊ฑฐ๊ธฐ์ TS์ ์ ๋ค?!? 365๋ ์ด ์ค๋ ๋์ ๋๊ธ์ ๋ฌ๊ณ ์ฐฌ์ฑํ ์ ์์ ๋งํผ ์ด ๊ธฐ๋ฅ์ ์ํฉ๋๋ค...
github์ ์๋ฆผ์ ์์ง๋ง ์ด ๋ฌธ์ ์ ์ ์๋์ง ์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ๋ชจ๋ ์ฌ๋์ ๋ด ์๊ฒฌ ์์ ์๋ PR ์ด์์ ์ดํด๋ณด์ธ์.
@RyanCavanaugh ์ฐ๋ฆฌ์๊ฒ ๊ฒ์์ ํ ์ ์๋ ๊ธฐํ๋ฅผ ์ฃผ์ ์ ๋๋จํ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ฝค ์์(~105 ts(x) ํ์ผ) ์ฝ๋ ๋ฒ ์ด์ค์ ๋ํด ๊ทธ๊ฒ์ ์คํํ๊ณ ์กฐ๊ธ ๊ฐ์ง๊ณ ๋์์ต๋๋ค. ์ค์ํ ๋ฌธ์ ๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค. ๋ค์์์ ๋ณ๊ฒฝ๋ ํ ์ค:
const refHtml = useRef(useMemo(() => document.getElementsByTagName('html')[0], []))
์๊ฒ:
const refHtml = useRef(useMemo(() => document.getElementsByTagName('html')[0] ?? null, []))
๋๋ ๋ค์ ์ฃผ์ ์ค๊ฐ ํ๋ก์ ํธ์์ ๊ทธ๊ฒ์ ์๋ํ ๊ฒ์ ๋๋ค.
@lonewarrior556 60๋ฐฐ ๋ ๋ง๊ณ upvotes๋ก ์ ๋ ฌํ๋ฉด ์ฒซ ํ์ด์ง์ ์์ต๋๋ค :)
@Bessonov Typescript ์ปดํ์ผ๋ฌ ์ฝ๋๋ฒ ์ด์ค์์ ์๋ํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. for-loop์ ์ฌ์ํ ์ฌ์ฉ์ผ๋ก ์ธํด ๋๊ท๋ชจ ์์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ๊ณตํ๊ธฐ ์ํด ์ตํธ์ธ/์์ํ๋ ํ๋๊ทธ๋ฅผ ๊ฐ์ง ์๋ ์์ต๋๋ค.
์ถ๊ฐํ๋ ๋ชจ๋ ํ๋๊ทธ๋ ํ ์คํธ ๋ฐ ์ง์์ด ํ์ํ ๋ ๋ค๋ฅธ ๊ตฌ์ฑ ๋งคํธ๋ฆญ์ค์ ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก TypeScript๋ ํ๋๊ทธ๋ฅผ ์ต์๋ก ์ ์งํ๋ ค๊ณ ํฉ๋๋ค.
@MatthiasKunnen ์ด๊ฒ์ด ์์ ๊ฒฝ์ฐ์ ๊ธฐ๋ฅ์ด๋ผ๋ฉด ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ์ง ์๋ ์คํ ๊ฐ๋ฅํ ์ด์ ๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ง์ ๋ฐฐ์ด ์ก์ธ์ค๋ ์ฝ๋์ ๋งค์ฐ ์์ฃผ ๋ํ๋๋ฉฐ ์ ํ ์์คํ ์ ๋์ ๋๋ ๊ตฌ๋ฉ์ด์ ์์ ํด์ผ ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด๋ฏ๋ก ํ๋๊ทธ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ๋๊ทธ๋ ์ด๊ฒ์ ๋ํ ์๋ชป๋ ์ ๊ทผ์
๋๋ค. ๋ถ๋ถ์ ์ผ๋ก๋ ์กฐํฉ
๋ฌธ์ . ์ฐ๋ฆฌ๋ ์ด๊ฒ์ TypeScript v5... ๊ทธ๋ฐ ์ข
๋ฅ์ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ๋ถ๋ฌ์ผ ํฉ๋๋ค.
ํ
์คํธ ๊ฐ๋ฅํ ์กฐํฉ์ ์๋ฅผ 2^N์์ N์ผ๋ก ๋ฐ๊ฟ๋๋ค...
2020๋
8์ 15์ผ ํ ์์ผ 15:56, Michael Burkman [email protected]
์ผ๋ค:
@MatthiasKunnen https://github.com/MatthiasKunnen ์ด๊ฒ์ด ์ผ๋ถ๋ผ๋ฉด
์์ ์ฃ์ง ์ผ์ด์ค ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด
์ด๋ฅผ ์ํด ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ์ญ์์ค. ๊ทธ๋ฌ๋ ์ง์ ๋ฐฐ์ด ์ก์ธ์ค๋ ์ฝ๋์ ๊ฝค ๋ํ๋ฉ๋๋ค.
์์ฃผ ๋ฐ์ํ๋ฉฐ ์ ํ ์์คํ ์ ๋๋ถ์ ๊ตฌ๋ฉ์ด์ ๋์์
์์ ์ ์ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด๋ฏ๋ก ํ๋๊ทธ๊ฐ ์ ๋นํ๋ค๊ณ ์๊ฐํฉ๋๋ค.โ
์ด ์ค๋ ๋์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/microsoft/TypeScript/issues/13778#issuecomment-674408067 ,
๋๋ ๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/AAADY5AXEY65S5HDGNGIPZDSA2O3FANCNFSM4C6KEKAA
.
๋ฐฉ๊ธ ์์์น ๋ชปํ ์ ์๋์ง ์์ ์ค๋ฅ๊ฐ ์๋ฐฑ ๋ช ์ ์ฌ์ฉ์์ ๋ํ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๋จ์์ผฐ์ต๋๋ค. ์ด ์ ํ ๊ฒ์ฌ๊ฐ ์์๋ค๋ฉด ๋น๋ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๊ฒ์ ๋๋ค. TypeScript๋ ์ฐ๋ฆฌ์๊ฒ ๋ ์์ ์ ์ธ ์ํํธ์จ์ด๋ฅผ ์ ๊ณตํ๋ ๋๋ผ์ด ๋ฐฉ๋ฒ์ด์์ง๋ง ์ด ํ ๋ฒ์ ๋๋ฝ์ผ๋ก ์ธํด ๊ทธ ๋ฐ์ด๋ ์ ํธ๋ฆฌํฐ๊ฐ ํผ์๋๊ณ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋๊ธ์ ๋ฌ๊ณ ์ ํ๋ ๋ค์ 10๋ช ์ PR #39560 ์ด์์ ๋์ ํ ์คํธํด ๋ณด๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
ESLint์ @typescript-eslint/no-unnecessary-condition
๊ท์น์ ํ์ฑํํ๋ ค๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ธ์คํด์ค์ ๋ํด ๋ถํํ๊ธฐ ๋๋ฌธ์ ์ด๋ ๋งค์ฐ ์ฑ๊ฐ์ ์ผ์
๋๋ค.
if (some_array[i] === undefined) {
๊ทธ๊ฒ์ ๊ทธ๊ฒ์ด ๋ถํ์ํ ์กฐ๊ฑด์ด๋ผ๊ณ ์๊ฐํ์ง๋ง(Typescript๊ฐ ๊ทธ๋ ๊ฒ ๋งํ๊ธฐ ๋๋ฌธ์!) ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ด ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ง๋ ์์ต๋๋ค.
์ด๊ฒ์ ์ ์ ํ๊ฒ ์์ ํ๋ ๊ฒ์ด ๊ฒ์ผ๋ฅธ Javascript ํ๋ก๊ทธ๋๋จธ ์๊ฒ ๋๋ฌด ๋ง์ ์์
์ด๋ผ๋ฉด undefined
์ถ๊ฐํ๋ ๋์ฒด ๋ฐฐ์ด ์ก์ธ์ค ๊ตฌ๋ฌธ์ด ์์ ์ ์์ต๋๋ค.
if (some_array[?i] === undefined) {
(์์์ ๊ตฌ๋ฌธ ์ ์, ๋์ ํ์)
@Timmmm ๋์ด ์์ฑํ ๋๊ธ ๋ฐ๋ก ์์ ์๋ ๋๊ธ์ ์ฝ์ด์ฃผ์ธ์. ์ด ์ ์์ ๋ฒ์ ์ ๊ตฌํํ๋ ๋น๋๋ฅผ ์๋ํ ์ ์์ต๋๋ค. eslint
๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ฉด ๊ฑฐ๊ธฐ์์ ์๋ ค์ฃผ์ญ์์ค.
@0rted ๊ทธ ๋๊ธ์ ์ฝ์์ต๋๋ค. ๋ด ์ ์์ ๋ฒ์ ์ ๊ตฌํํ์ง ์์ต๋๋ค. ์ด์ฉ๋ฉด ๋น์ ์ ๋ค์ ์ฝ์ด์ผํ๋ค.
์ฃ์กํฉ๋๋ค. "์ด" ์ ์์ด๋ผ๊ณ ํ์ ๋ OP์ ๊ธฐ๋ฅ, ์ฆ array_of_T[i]
์ T | undefined
๋ก ์ทจ๊ธํ๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค. ํน์ ์ธ๋ฑ์ค ์ฐ์ฐ์๋ฅผ "์ ์๋์ง ์์์ ์ ์์"์ผ๋ก ํ์ํ๋ ๊ตฌ๋ฌธ์ ๋ํด ๋ฌป๋ ๊ฒ์ ์์ง๋ง Ryan์ PR์์ ๊ตฌํ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ธ๋ฑ์ค ์ฐ์ฐ์๊ฐ "์ ์๋์ง ์์ ์ ์์"์ด๋ฏ๋ก ํ์ํ์ง ์์ต๋๋ค. . ๊ทธ๊ฒ์ด ๋น์ ์ ํ์๋ฅผ ์ถฉ์กฑ์ํค์ง ์์ต๋๊น?
์, - ๋ง์ฝ/์ธ์ ๊ทธ๊ฒ์ด ์ฐฉ๋ฅํ๋ค๋ฉด ๋๋ ํ์คํ ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด ํ ๋ก ์์ ๋ง์ ์ฌ๋๋ค์ด ์ถ๊ฐ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๊ณ ๋ ๋ณต์กํ๊ฒ ์๋ํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์(๋จ์ํ for ๋ฃจํ ์์ ) ๊ทธ๊ฒ์ ์ ํญํ๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค.
๊ทธ๋์ ๋์์ ์ ์ํ๊ณ ์ถ์์ง๋ง ์ฌ๋๋ค์ด ์ซ์ดํ๋ ๊ฒ ๊ฐ๋ค. :-/
๋ชจ๋ ์ข์ ์๋์ ์ ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. @Timmmm์ ์๋ชป๋ ๋ฐฉ์์ผ๋ก ๋ฐ์๋ค์ด์ง ๋ง์ญ์์ค. ๋๋ downvotes๊ฐ ์ด๊ฒ์ด์ด ์์ ์์์ด ์ค๋ ๋์์ ์ด๋ฏธ ์ ๋ฐํ ๊ธฐ๋ฐ์ด๋ผ๋ ๊ฒ์ ์ ๋ฌํ ๋ฟ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ์๊ฒ๋ ์ ๋ฐ์ ์ผ๋ก ์ ํ ์์ ์ฑ์ ํฅ์์ํค๋ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋ก์ด ์ตํธ์ธ ๊ตฌ๋ฌธ์ ๋์ ํ๋ ๊ฒ๋ณด๋ค ๋น์ฉ์ด ํจ์ฌ ์ ๋ ดํฉ๋๋ค.
์์์ ์ธ๊ธํ์ง ์์์ง๋ง ์ผํ์ฑ ์ฌ์ ์ ๊ตฌ๋ฌธ์ด ์ด๋ฏธ ์กด์ฌํฉ๋๋ค: if ((some_array[i] as MyType | undefined) === undefined)
. ๊ทธ๊ฒ์ ์๋ก์ด ์๊ธฐ๋ก ๊ฐ๊ฒฐ๋ก ์๋์ง๋ง ์ํ๋ฉด ๋น์ ์ด ์์ฃผ ์ฌ์ฉํด์ผ ํ ๊ฑฐ๋ผ๊ณ ๊ตฌ์กฐ ์๋์์.
_Originally์ @osyrisrblx์ ์ํด ๊ฒ์ https://github.com/microsoft/TypeScript/issues/40435#issuecomment -690017567_
์ด๊ฒ์ด ํจ์ฌ ์์ ํ ์ต์ ์ฒ๋ผ ๋ณด์ด์ง๋ง ํญ์ ์ ์๋์ด ์๋ค๊ณ 100% ํ์ ํ๋ ๋๋ฌธ ๊ฒฝ์ฐ๋ฅผ ์ํด ๋ณ๋์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ด ๋์์ ์ตํธ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
!:
๊ฐ ํญ์ ์ ์๋ ๊ฒ์ ์ฃผ์ฅํ ์ ์์ต๋๊น?interface X { [index: string]!: number; // -> number } interface Y { [index: string]: number; // -> number | undefined }
๊ทธ ์ ์์ ๋ฌธ์ ๋ฅผ ์๋ชป ์ค๋ช ํฉ๋๋ค. ๋ฌธ์ ๋ ์ ํ ์์ฒด์ ๋ํ TypeScript์ ์ดํด์ ์์ง ์์ต๋๋ค. ๋ฌธ์ ๋ ์ด ์ค๋ ๋์ ์๋ถ๋ถ์์ ์ด๋ฏธ ์๋ก์ด ๊ตฌ๋ฌธ์ด ์ ์๋ ๋ฐ์ดํฐ _์ก์ธ์ค_์์ ๋ฐ์ํฉ๋๋ค.
๊ณง ์ถ์๋ TypeScript 4.1 ๋ฒ ํ์์ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค.
์ด์ ์ ์ ๊ณต๋์๋ค๋ฉด ์ฃ์กํ์ง๋ง {[index: string]?: number} // -> number | undefined
๋ฅผ ์ง์ํ ์ ์์ต๋๊น? ์ธํฐํ์ด์ค ์ ํ์ ์์ฑ ๊ตฌ๋ฌธ๊ณผ ์ผ์นํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ํ๋ฉฐ "?"๋ก ์ ์๋์ง ์์ ์ ์์ต๋๋ค.
4.1์ ์ปดํ์ผ๋ฌ ์ต์ ์ ํ๋ฅญํ์ง๋ง ๋ ์ธ๋ถ์ ์ผ๋ก ์ ์ดํ๋ โโ๊ฒ๋ ์ข์ต๋๋ค.
๋น์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๊ทธ๊ฒ์ ์๋ํ๊ณ ์ถ๋ค๋ฉด (๋๋ฅผ ์์๋ด๋ ๋ฐ ์ฝ๊ฐ์ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค):
yarn (add|upgrade) typescript@next
"noUncheckedIndexedAccess": true
๋ด ํ๋ก์ ํธ์์ ์ด ๊ท์น์ ํ์ฑํํ๋ ๊ณผ์ ์์ ๋ค์๊ณผ ๊ฐ์ ํฅ๋ฏธ๋ก์ด ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
type MyRecord = { a: number; b: string };
declare const myRecord: MyRecord;
declare const key: 'a' | 'b';
const value = myRecord[key]; // string | number โ
// โ Unexpected error
// Type 'MyRecord[Key] | undefined' is not assignable to type 'MyRecord[Key]'
const fn = <Key extends keyof MyRecord>(key: Key): MyRecord[Key] => myRecord[key];
์ด ๊ฒฝ์ฐ key
๊ฐ keyof MyRecord
์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์ myRecord[key]
๊ฐ MyRecord[Key] | undefined
์ ํ์ ๋ฐํํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์์์ต๋๋ค.
์ ๋ฐ์ดํธ : ์ ์ถ๋ ๋ฌธ์ https://github.com/microsoft/TypeScript/issues/40666
๊ทธ๊ฒ์ ์๋ง๋ ๋ฒ๊ทธ / ์ค์ ์ผ ๊ฒ์ ๋๋ค!
๋ด ํ๋ก์ ํธ์์ ์ด ๊ท์น์ ํ์ฑํํ๋ ๊ณผ์ ์์ ๋ค์๊ณผ ๊ฐ์ ํฅ๋ฏธ๋ก์ด ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
type MyRecord = { a: number; b: string }; declare const myRecord: MyRecord; declare const key: 'a' | 'b'; const value = myRecord[key]; // string | number โ // โ Unexpected error // Type 'MyRecord[Key] | undefined' is not assignable to type 'MyRecord[Key]' const fn = <Key extends keyof MyRecord>(key: Key): MyRecord[Key] => myRecord[key];
์ด ๊ฒฝ์ฐ
key
๊ฐkeyof MyRecord
์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์myRecord[key]
๊ฐMyRecord[Key] | undefined
์ ํ์ ๋ฐํํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋ฒ๊ทธ๋ผ๊ณ ๋งํ๊ณ ์ถ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก keyof Type
๋ฌธ์์ด/์ซ์ ๋ฆฌํฐ๋ด ์ ํ๋ง ํฌํจ๋๋ ๊ฒฝ์ฐ(์ค์ ๋ก string
๋๋ number
ํฌํจํ๋ ๊ฒ๊ณผ ๋ฐ๋) Type[Key]
์ฌ๊ธฐ์ Key extends keyof Type
undefined
ํฌํจํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
#13195์ ๋ํ ๊ต์ฐจ ์ฐ๊ฒฐ, "์ฌ๊ธฐ์ ์์ฑ์ด ์์ต๋๋ค"์ "์ฌ๊ธฐ์ ์์ฑ์ด ์์ง๋ง undefined
" ๊ฐ์ ์ฐจ์ด์ ๊ณผ ์ ์ฌ์ ๋ ์ดํด๋ด
๋๋ค.
์ฌ๊ธฐ์์ ์ค๊ณ ์ ํ๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ์ถ์
์ฐธ๊ณ : ์ด ํ๋๊ทธ ๋๋ถ์ ๋ด ์ฝ๋๋ฒ ์ด์ค์์ ๋ ๊ฐ์ ๋ฒ๊ทธ๋ฅผ ์ก์์ต๋๋ค. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
arr.length > 0
๋ฅผ ํ์ธํ๋ ๊ฒ๋ง์ผ๋ก๋ arr[0]
๋ฅผ ๋ณดํธํ๊ธฐ์ ์ถฉ๋ถํ์ง ์๋ค๋ ๊ฒ์ด ์กฐ๊ธ ์ง์ฆ๋์ง๋ง, ์ถ๊ฐ ์์ ์ธ IMO์ ๋นํด ์ฝ๊ฐ์ ๋ถํธํจ(tsc๋ฅผ ๋ง์กฑ์ํค๊ธฐ ์ํด ์ํ๋ฅผ ๋ค์ ์์ฑํ ์ ์์)์
๋๋ค.
@rubenlg arr.length
๋์ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์์๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ์ต๋๋ค.
const firstEl = arr[0];
if (firstEl !== undefined) {
...
}
๊ทธ๋ฐ๋ฐ if (arr.length > 2)
์ด์์ ํ๋ ๊ณณ์ด ๋ช ๊ตฐ๋ฐ ์๋๋ฐ ์ข ์ด์ํฉ๋๋ค. ๊ทธ๋ฌ๋ .length
๊ฒ์ด ์ด์จ๋ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ํ ์ ํ ์์ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
const a: number[] = [];
a.length = 1;
if (a.length > 0) {
const b: number = a[0];
console.log(b);
}
undefined
์ธ์ํฉ๋๋ค.
๊ทธ๋ฌ๋
.length
๊ฒ์ด ์ด์จ๋ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ํ ์ ํ ์์ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.const a: number[] = []; a.length = 1; if (a.length > 0) { const b: number = a[0]; console.log(b); }
undefined
์ธ์ํฉ๋๋ค.
๊ทธ๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ์ด๋ฐ ์ข ๋ฅ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ํฌ์ ๋ฐฐ์ด์ผ ๊ฒ์ ๋๋ค. ์ ํ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฐํํ๊ธฐ ์ํด ํ ์ ์๋ ๋นํ์ค ๋๋ ๊ตํํ ์ผ์ด ํญ์ ์์ต๋๋ค.
ํญ์ ์ด์ ๊ฐ์ ์ ๋ฌดํจํํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ๊ทธ๊ฒ์ด ๋ฌธ์ ์ ๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ์คํ ๊ฒฝ๋ก๋ฅผ ๋ถ์ํ๋ ๊ฒ์ ๋๋ฌด ๋ง์ ๋น์ฉ์ด ๋ญ๋๋ค.
const a: number[] = [1]
if (a.length > 0) {
a.pop();
console.log(a[0])
}
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
TypeScript์ ๋ชฉํ ์ค ํ๋๋ ํน์ ์์ ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ์๊ฐ ๊ธฐ์ตํ๊ฑฐ๋ ์๋๋ก ์์กดํ๊ธฐ๋ณด๋ค "์ปดํ์ผ" ์๊ฐ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ ์ ์๋๋ก ํ๋ ๊ฒ ์๋๋๊น? ์ด๊ฒ์ ๊ทธ ๋ชฉํ์ ์ด๊ธ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ถฉ๋์ ํผํ๊ธฐ ์ํด ์ฌ์ฉ์์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ์๊ตฌํฉ๋๋ค. ๋ค๋ฅธ ๋ง์ ๊ธฐ๋ฅ์ ๋ํด์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ํญ์ x๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ํ์ํ์ง ์์ต๋๋ค. TypeScript์ ๋ชฉํ๋ (์๋ง๋) ์์ ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ด๋ฌํ ๊ฒ๋ค์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค.
๊ธฐ์กด ์ฝ๋์์
strictNullChecks
๋ฅผ ํ์ฑํํ๊ณ ์ด๋ฏธ ๋น๊ต๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ทธ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ด๊ฐ ์์ ํ ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด ์๋ง ์ฌ๊ธฐ์ ๋ฌธ์ ๋ฅผ ๊นจ๋ซ์ง ๋ชปํ์ ๊ฒ์ด๊ณ (์ ํ ์์คํ ์ ํญ์ ๊ฐ์ ์ป๊ณ ์๋ค๊ณ ๋์๊ฒ ๋งํ๊ณ ์์) ๋ฐํ์ ์ค๋ฅ๋ก ๋๋ฌ์ต๋๋ค. TS ๊ฐ๋ฐ์๊ฐ| undefined
๋ชจ๋ ์ง๋๋ฅผ ์ ์ธํด์ผ ํ๋ค๋ ์ฌ์ค์ ๊ธฐ์ต(๋๋ ๋ ๋์๊ฒ๋ ์๊ณ ์์)ํ๋ ๊ฒ์ TypeScript๊ฐ ์ฌ๋๋ค์ด ์ค์ ๋ก ์ํ๋ ๊ฒ์ ์ํํ์ง ๋ชปํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค.