# ๐ Item06 ~ 10
# Item06. ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์์คํ ํ์ํ๊ธฐ
- ํธ์ง๊ธฐ๋ ์ฝ๋๋ฅผ ๋น๋ํ๊ณ ํ์ ์์คํ ์ ์ตํ ์ ์๋ ์ต๊ณ ์ ์๋จ์ด๋ค.
- ํธ์ง๊ธฐ๋ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ธ์ ํ์ ์ถ๋ก ์ ์ํํ ์ ์๋์ง์ ๋ํ ๊ฐ๋ ์ ์ก๊ฒ ํด ์ฃผ๋๋ฐ, ์ด ๊ฐ๋ ์ ํ์คํ ์ก์์ผ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
- ํธ์ง๊ธฐ๋ง๋ค ์กฐ๊ธ์ฉ ๋ค๋ฅด์ง๋ง ๋ณดํต์ ๊ฒฝ์ฐ ์ฌ๋ฒ ์์ ๋ง์ฐ์ค ์ปค์๋ฅผ ๋๋ฉด ํ์ ์คํฌ๋ฆฝํธ๊ฐ ๊ทธ ํ์ ์ ์ด๋ป๊ฒ ํ๋จํ๊ณ ์๋์ง ํ์ธํ ์ ์๋ค.
- ๊ฐ์ฒด์์๋ ๊ฐ๋ณ ์์ฑ์ ์ดํด๋ด์ผ๋ก์จ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ป๊ฒ ๊ฐ๊ฐ์ ์์ฑ์ ์ถ๋ก ํ๋์ง ์ดํด๋ณผ ์ ์๋ค.
- ์ค์ ์ฝ๋์์ ํจ์ ํธ์ถ์ด ๊ธธ๊ฒ ์ด์ด์ง๋ค๋ฉด ์ถ๋ก ์ ๋ณด๋ ๋๋ฒ๊น ํ๋๋ฐ ๊ผญ ํ์ํ๋ค.
- ํธ์ง๊ธฐ์์ ํ์ ์ค๋ฅ๋ฅผ ์ดํด๋ณด๋ ๊ฒ๋ ํ์ ์์คํ ์ ์ฑํฅ์ ํ์ ํ๋ ๋ฐ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
- ์ค๋ฅ ํ์ ์์
function getElement(elOrId: string | HTMLElement | null): HTMLElement {
if (typeof elOrId === 'object') {
return elOrId; // 'HTMLElement | null' ํ์์ 'HTMLElement' ํ์์ ํ ๋นํ ์ ์์ต๋๋ค.
} else if (elOrId === null) {
return document.body;
} else {
const el = document.getElementById(elOrId);
return el; // 'HTMLElement | null' ํ์์ 'HTMLElement' ํ์์ ํ ๋นํ ์ ์์ต๋๋ค.
}
}
- ์ ์์ ์์ ์ฒซ ๋ฒ์งธ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฌธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ด์ ๋
typeof null
๋"object"
์ด๋ฏ๋กelOrId
๋ ์ฌ์ ํ ํด๋น ๋ถ๊ธฐ๋ฌธ ๋ด์์null
์ผ ๊ฐ๋ฅ์ฑ์ด ์๋ค.- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฒ์์
null
์ฒดํฌ๋ฅผ ์ถ๊ฐํด์ ๋ฐ๋ก์ก์์ผ ํ๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฒ์์
- ๋ ๋ฒ์งธ ์ค๋ฅ๋
document.getElementById
๊ฐ ์ฌ์ ํnull
์ ๋ฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฒซ ๋ฒ์งธ ์ค๋ฅ์ ๋์ผํ๊ฒnull
์ฒดํฌ๋ฅผ ํด์ค์ผ ํ๋ค.
- ํ์
์ ์ธ(
d.ts
ํ์ผ)์ ์ฒ์์๋ ์ดํดํ๊ธฐ ์ด๋ ต์ง๋ง ํ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ฌด์์ ํ๋์ง, ์ด๋ป๊ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ชจ๋ธ๋ง๋์๋์ง, ์ด๋ป๊ฒ ์ค๋ฅ๋ฅผ ์ฐพ์๋ผ์ง ์ดํด๋ณผ ์ ์๋ ํ๋ฅญํ ์๋จ์ด ๋๋ค.
# Item07. ํ์ ์ด ๊ฐ๋ค์ ์งํฉ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ
- ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ , ์ฆ ํ์
์คํฌ๋ฆฝํธ๊ฐ ์ค๋ฅ๋ฅผ ์ฒดํฌํ๋ ์๊ฐ์๋ 'ํ์
'์ ๊ฐ์ง๊ณ ์๋ค.
- 'ํ ๋น ๊ฐ๋ฅํ ๊ฐ๋ค์ ์งํฉ'์ด ํ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- ์ด ์งํฉ์ ํ์ ์ '๋ฒ์'๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
๊ฐ์ฅ ์์ ์งํฉ์ ์๋ฌด ๊ฒ๋ ํฌํจํ์ง ์๋ ๊ณต์งํฉ์ด๋ฉฐ, ํ์ ์คํฌ๋ฆฝํธ์์๋
never
ํ์ ์ด๋ค.- ์ด ํ์ ์ผ๋ก ์ ์ธ๋ ๋ณ์์ ๋ฒ์๋ ๊ณต์งํฉ์ด๋ฏ๋ก ์๋ฌด๋ฐ ๊ฐ๋ ํ ๋นํ ์ ์๋ค.
์ ๋ ํ์ (๋ฆฌํฐ๋ด ํ์ ) :
never
ํ์ ๋ค์์ผ๋ก ์์ ์งํฉ์ธ ํ ๊ฐ์ง ๊ฐ๋ง ํฌํจํ๋ ํ์์ ๋์จ ํ์ : ๊ฐ ์งํฉ๋ค์ ํฉ์งํฉ์ ์๋ฏธํ๋ฉฐ ํ์ ๋ค์
|
์ผ๋ก ๋ฌถ์ด์ค๋ค.'ํ ๋น ๊ฐ๋ฅํ'์ ์๋ฏธ
- ์งํฉ์ ๊ด์ ์์, '~์ ์์(๊ฐ๊ณผ ํ์ ์ ๊ด๊ณ)' ๋๋ '~์ ๋ถ๋ถ์งํฉ(๋ ํ์ ์ ๊ด๊ณ)'์ ์๋ฏธ
์งํฉ์ ๊ด์ ์์, ํ์ ์ฒด์ปค์ ์ฃผ์ ์ญํ ์ ํ๋์ ์งํฉ์ด ๋ค๋ฅธ ์งํฉ์ ๋ถ๋ถ ์งํฉ์ธ์ง ๊ฒ์ฌํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ธํฐ์น์ ํ์ : ๋ ํ์ ์ ๊ต์งํฉ์ ์๋ฏธํ๋ฉฐ
&
์ฐ์ฐ์๋ก ์ด์ด์ค๋ค.
interface Person {
name: string;
}
interface Lifespan {
birth: Date;
death?: Date;
}
type PersonSpan = Person & Lifespan;
const ps: PersonSpan = {
name: 'abc',
birth: new Date('1910/01/01'),
death: new Date('1966/12/21'),
}; // ์ ์
- ๋น์ฐํ ์์ ์ธ ๊ฐ์ง๋ณด๋ค ๋ ๋ง์ ์์ฑ์ ๊ฐ์ง๋ ๊ฐ๋
PersonSpan
ํ์ ์ ์ํ๋ค.
keyof (A & B) = (keyof A) | (keyof B)
keyof (A | B) = (keyof A & keyof B)
- ์ผ๋ฐ์ ์ผ๋ก๋ ์ธํฐ์น์
๋ณด๋ค
extends
ํค์๋๋ฅผ ์ฌ์ฉํด์ ํ์ ์ ์ ์ธํ๋ค.
interface Person {
name: string;
}
interface PersonSpan extends Person {
birth: Date;
death?: Date;
}
extends
์ ์๋ฏธ๋ '~์ ํ ๋น ๊ฐ๋ฅํ'๊ณผ ๋น์ทํ๊ฒ, '~์ ๋ถ๋ถ ์งํฉ'์ด๋ผ๋ ์๋ฏธ๋ก ๋ฐ์๋ค์ผ ์ ์๋ค.extends
ํค์๋๋ ์ ๋ค๋ฆญ ํ์ ์์ ํ์ ์๋ก๋ ์ฐ์ด๋ฉฐ, ์ด ๋ฌธ๋งฅ์์๋ '~์ ๋ถ๋ถ ์งํฉ'์ ์๋ฏธํ๊ธฐ๋ ํ๋ค.
keyof
๋ฅผ ํตํด ํ ๋น๊ณผ ์์ ๊ด๊ณ ์ดํด๋ณด๊ธฐ
interface Point {
x: number;
y: number;
}
type PointKeys = keyof Point; // ํ์
์ "x" | "y"
function sortBy<K extends keyof T, T>(vals: T[], key: K): T[] {
// ...
}
const pts: Point[] = [
{ x: 1, y: 1 },
{ x: 2, y: 0 },
];
sortBy(pts, 'x'); // ์ ์, 'x'๋ 'x' | 'y'๋ฅผ ์์ (์ฆ, keyof T)
sortBy(pts, 'y'); // ์ ์, 'y'๋ 'x' | 'y'๋ฅผ ์์
sortBy(pts, Math.randomm() < 0.5 ? 'x' : 'y'); // ์ ์, 'x' | 'y๋ 'x' | 'y'๋ฅผ ์์
sortBy(pts, 'z'); // '"z"' ํ์์ ์ธ์๋ '"x" | "y"' ํ์์ ๋งค๊ฐ๋ณ์์ ํ ๋น๋ ์ ์์ต๋๋ค.
- ํ์ ์ด ์งํฉ์ด๋ผ๋ ๊ด์ ์ ๋ฐฐ์ด๊ณผ ํํ์ ๊ด๊ณ ์ญ์ ๋ช ํํ๊ฒ ๋ง๋ ๋ค.
const triple: [number, number, number] = [1, 2, 3];
const double: [number, number] = triple;
// '[number, number, number]' ํ์์
// '[number, number]' ํ์์ ํ ๋นํ ์ ์์ต๋๋ค.
// 'length' ์์ฑ์ ํ์์ด ํธํ๋์ง ์์ต๋๋ค.
// '3' ํ์์ '2' ํ์์ ํ ๋นํ ์ ์์ต๋๋ค.
- ์์์ ๊ธธ์ด๋ฅผ ์ฒดํฌํ๋ ๊ฒ์ ํฉ๋ฆฌ์ ์ด๋ฉฐ, ์ด๋ณด๋ค ๋์ ๋ฐฉ๋ฒ์ ์์ ๊ฒ์ด๋ค.
๐ก ๊ฒฐ๋ก !
ํ์ ์ ๊ฐ์ ์งํฉ์ผ๋ก ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ํธํ๊ณ '์์', 'ํ ๋น ๊ฐ๋ฅ', '์๋ธ ํ์ '์ '๋ถ๋ถ ์งํฉ'๊ณผ ๊ฐ์ ์๋ฏธ๋ก ๋ฐ์๋ค์ด๋ฉด ํธํ๋ค.
# Item08. ํ์ ๊ณต๊ฐ๊ณผ ๊ฐ ๊ณต๊ฐ์ ์ฌ๋ฒ ๊ตฌ๋ถํ๊ธฐ
interface Cylinder {
radius: number;
height: number;
}
const Cylinder = (radius: number, height: number) => ({ radius, height });
interface Cylinder
์์Cylinder
๋ ํ์ ์ผ๋ก ์ฐ์ด๊ณ ,const Cylinder
์์Cylinder
๋ ์ด๋ฆ์ ๊ฐ์ง๋ง ๊ฐ์ผ๋ก ์ฐ์ด๋ฉฐ, ์๋ก ์๋ฌด๋ฐ ๊ด๋ จ๋ ์๋ค.- ์ํฉ์ ๋ฐ๋ผ
Cylinder
๋ ํ์ ์ผ๋ก ์ฐ์ผ ์๋ ์๊ณ , ๊ฐ์ผ๋ก ์ฐ์ผ ์๋ ์๋ค.
- ์ํฉ์ ๋ฐ๋ผ
function calculateVolume(shape: unknown) {
if (shape instanceof Cylinder) {
console.log(shape.radius); // '{}' ํ์์ 'radius' ์์ฑ์ด ์์ต๋๋ค.
}
}
- ํ์ง๋ง ์ ์ฝ๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณค ํ๋ค.
instanceof
๋ฅผ ์ด์ฉํดshape
๊ฐCylinder
ํ์ ์ธ์ง ์ฒดํฌํ๋ ค๊ณ ํ๋ ๊ตฌ๋ฌธ์ธ๋ฐ,instancof
๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐํ์ ์ฐ์ฐ์์ด๊ณ , ๊ฐ์ ๋ํด์ ์ฐ์ฐ์ ํ๋ค.- ๊ทธ๋์
instanceof Cylinder
๋ ํ์ ์ด ์๋๋ผ ํจ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ค.
class
์enum
์ ์ํฉ์ ๋ฐ๋ผ ํ์ ๊ณผ ๊ฐ ๋ ๊ฐ์ง ๋ชจ๋ ๊ฐ๋ฅํ ์์ฝ์ด์ด๋ค.
class Cylinder {
radius = 1;
height = 1;
}
function calculateVolume(shape: unknown) {
if (shape instanceof Cylinder) {
console.log(shape); // ์ ์, ํ์
์ Cylinder
console.log(shape.raidus); // ์ ์, ํ์
์ number
}
}
- ํด๋์ค๊ฐ ํ์ ์ผ๋ก ์ฐ์ผ ๋๋ ํํ(์์ฑ๊ณผ ๋ฉ์๋)๊ฐ ์ฌ์ฉ๋๋ ๋ฐ๋ฉด, ๊ฐ์ผ๋ก ์ฐ์ผ ๋๋ ์์ฑ์๊ฐ ์ฌ์ฉ๋๋ค.
typeof
๋ ํ์ ๊ณผ ๊ฐ์์ ์ฐ์ผ ๋ ์๋ก ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํ๋ค.
type T1 = typeof p; // ํ์
์ Person
type T2 = typeof email; // ํ์
์ (p: Person, subject: string, body: string) => Response
const v1 = typeof p; // ๊ฐ์ "object"
const v2 = typeof email; // ๊ฐ์ "function"
const v = typeof Cylinder; // ๊ฐ์ด "function"
type T = typeof Cylinder; // ํ์
์ด typeof Cylinder(Cylinder๊ฐ ์ธ์คํด์ค์ ํ์
์ด ์๋๋ผ ์ค์ ๋ก๋ new ํค์๋๋ฅผ ์ฌ์ฉํ ๋ ๋ณผ ์ ์๋ ์์ฑ์ ํจ์์ด๋ค.)
ํ์ ์ ๊ด์
- ๊ฐ์ ์ฝ์ด์ ํ์ ์คํฌ๋ฆฝํธ์ ํ์ ์ ๋ฐํ
- ํ์
๊ณต๊ฐ์
typeof
๋ ๋ณด๋ค ํฐ ํ์ ์ ์ผ๋ถ๋ถ์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ ,type
๊ตฌ๋ฌธ์ผ๋ก ์ด๋ฆ์ ๋ถ์ด๋ ์ฉ๋๋ก๋ ์ฌ์ฉํ ์ ์์
๊ฐ์ ๊ด์
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์
typeof
์ฐ์ฐ์๊ฐ ๋๋ค. - ๋์ ์ฌ๋ฒ์ ๋ฐํ์ ํ์ ์ ๊ฐ๋ฆฌํค๋ ๋ฌธ์์ด์ ๋ฐํ
- ์๋ฐ์คํฌ๋ฆฝํธ์๋ ๊ณผ๊ฑฐ๋ถํฐ ์ง๊ธ๊น์ง ๋จ 6๊ฐ(
string
,number
,boolean
,undefined
,object
,function
)์ ๋ฐํ์ ํ์ ๋ง์ด ์กด์ฌ
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์
InstanceType
์ด๋ผ๋ ์ ํธ๋ฆฌํฐ ํ์ ์ ํตํด ์์ฑ์์ ํ์ ๊ณผ ์ธ์คํด์ค ํ์ ์ ์ ํํ ์ ์๋ค.
- ์์ฑ ์ ๊ทผ์์ธ
[]
๋ ํ์ ์ผ๋ก ์ฐ์ผ ๋์๋ ๋์ผํ๊ฒ ๋์ํ๋ค.- ๊ทธ๋ฌ๋
obj['field']
์obj.field
๋ ๊ฐ์ด ๋์ผํ๋๋ผ๋ ํ์ ์ ๋ค๋ฅผ ์ ์๋ค. - ๋ฐ๋ผ์ ํ์
์ ์์ฑ์ ์ป์ ๋์๋ ๋ฐ๋์ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ
obj['field']
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ๊ทธ๋ฌ๋
const first: Person['first'] = p['first']; // ๋๋ ๊ฐ ์์ฑ์ p.first
- ์ด ๋ ์ธ๋ฑ์ค ์์น์๋ ์ ๋์จ ํ์ ๊ณผ ๊ธฐ๋ณธํ ํ์ ์ ํฌํจํ ์ด๋ ํ ํ์ ์ด๋ ์ฌ์ฉํ ์ ์๋ค.
type PersonEl = Person['first' | 'last']; // ํ์
์ string
type Tuple = [string, number, Date];
type TupleEl = Tuple[number]; // ํ์
์ string | number | Date
# โ ํ์ ๊ณต๊ฐ๊ณผ ๊ฐ ๊ณต๊ฐ ์ฌ์ด์์ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ์ฝ๋ ํจํด
this
ํค์๋&
,|
ํค์๋- ๊ฐ์ผ๋ก ์ฐ์ด๋ฉด AND์ OR ์ฐ์ฐ
- ํ์ ์ผ๋ก ์ฐ์ด๋ฉด ์ธํฐ์น์ ํ์ ๊ณผ ์ ๋์จ ํ์
const
๋ ์ ๋ณ์๋ฅผ ์ ์ธํ์ง๋ง,as const
๋ ๋ฆฌํฐ๋ด ๋๋ ๋ฆฌํฐ๋ด ํํ์์ ์ถ๋ก ๋ ํ์ ์ ๋ฐ๊ฟextends
ํค์๋- ์๋ธ ํด๋์ค(
class A extends B
) ๋๋ ์๋ธํ์ (interface A extends B
) ๋๋ ์ ๋ค๋ฆญ ํ์ ์ ํ์ ์(Generic<T extends number>
)๋ฅผ ์ ์ํ ์ ์์
- ์๋ธ ํด๋์ค(
in
ํค์๋- ๊ฐ์ผ๋ก ์ฐ์ด๋ฉด ๋ฃจํ(
for (key in object)
) - ํ์ ์ผ๋ก ์ฐ์ด๋ฉด ๋งคํ๋(mapped) ํ์
- ๊ฐ์ผ๋ก ์ฐ์ด๋ฉด ๋ฃจํ(
# โ ๏ธ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ ์ฌ์ฉ์ ์ฃผ์ํ์
function email(options: {person: Person, subject: string, body: string}) {}
// ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ ์ฌ์ฉ์
function email({email, subject, body}) {}
// ํ์
์คํฌ๋ฆฝํธ์์ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ ์๋ชป ์ฌ์ฉํ ์์
function email({
person: Person, // ๋ฐ์ธ๋ฉ ์์ 'Person'์ ์์์ ์ผ๋ก 'any' ํ์์ด ์์ต๋๋ค.
subject: string, // 'string' ์๋ณ์๊ฐ ์ค๋ณต๋์์ต๋๋ค. ๋ฐ์ธ๋ฉ ์์ 'string'์ ์์์ ์ผ๋ก 'any' ํ์์ด ์์ต๋๋ค.
body: string, // 'string' ์๋ณ์๊ฐ ์ค๋ณต๋์์ต๋๋ค. ๋ฐ์ธ๋ฉ ์์ 'string'์ ์์์ ์ผ๋ก 'any' ํ์์ด ์์ต๋๋ค.
})
- ๊ฐ์ ๊ด์ ์์
Person
๊ณผstring
์ด ํด์๋์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.Person
์ด๋ผ๋ ๋ณ์๋ช ๊ณผstring
์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง๋ ๋ ๊ฐ์ ๋ณ์๋ฅผ ์์ฑํ๋ คํ ๊ฒ์ด๋ค.- ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ํ์ ๊ณผ ๊ฐ์ ๊ตฌ๋ถํด์ผ ํ๋ค.
// ํ์
์คํฌ๋ฆฝํธ์์ ๊ตฌ์กฐ ๋ถํด ๋ฌธ๋ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ ์์
function email({person, subject, body}: {person: Person, subject: string, body: string}) {}
# Item09. ํ์ ๋จ์ธ๋ณด๋ค๋ ํ์ ์ ์ธ์ ์ฌ์ฉํ๊ธฐ
# (1) ํ์ ์ ์ธ๊ณผ ํ์ ๋จ์ธ
interface Person {
name: string;
}
const alice: Person = { name: 'Alice' }; // ํ์
์ ์ธ
const bob = { name: 'Bob' } as Person; // ํ์
๋จ์ธ
- ํ์ ๋จ์ธ๋ณด๋ค๋ ํ์ ์ ์ธ์ ์ฌ์ฉํ๋๊ฒ ๋ซ๋ค.
const alice: Person = {}; // 'Person' ์ ํ์ ํ์ํ 'name' ์์ฑ์ด '{}' ์ ํ์ ์์ต๋๋ค.
const bob = {} as Person; // ์ค๋ฅ ์์
- ํ์ ์ ์ธ์ ํ ๋น๋๋ ๊ฐ์ด ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๋ง์กฑํ๋์ง ๊ฒ์ฌํ๋ค.
- ํ์ ๋จ์ธ์ ๊ฐ์ ๋ก ํ์ ์ ์ง์ ํ์ผ๋ ํ์ ์ฒด์ปค์๊ฒ ์ค๋ฅ๋ฅผ ๋ฌด์ํ๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค.
- ํ์ ๋จ์ธ์ด ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด, ์์ ์ฑ ์ฒดํฌ๋ ๋๋ ํ์ ์ ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
# (2) ํ์ดํ ํจ์์ ํ์ ์ ์ธ
const people = ['alice', 'bob', 'jan'].map(
(name): Person => ({name});
); // ํ์
์ Person[]
- ์ ์ฝ๋์์ ์๊ดํธ๋ ๋งค์ฐ ์ค์ํ ์๋ฏธ๋ฅผ ์ง๋๋ค.
(name): Person
์name
์ ํ์ ์ด ์๊ณ , ๋ฐํ ํ์ ์ดPerson
์ด๋ผ๊ณ ๋ช ์ํ๋ค.- ๊ทธ๋ฌ๋
(name: Person)
์name
์ ํ์ ์ดPerson
์์ ๋ช ์ํ๊ณ ๋ฐํ ํ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
// ์ํ๋ ๋ฐํ ํ์
๊น์ง ๋ช
์ํ ๋ฒ์
const people: Person[] = ['alice', 'bob', 'jan'].map(
(name): Person => ({name});
);
๋จ, ํจ์ ํธ์ถ ์ฒด์ด๋์ด ์ฐ์๋๋ ๊ณณ์์๋ ์ฒด์ด๋ ์์์์๋ถํฐ ๋ช ๋ช ๋ ํ์ ์ ๊ฐ์ ธ์ผ ํ๋ค.
๊ทธ๋์ผ ์ ํํ ๊ณณ์ ์ค๋ฅ๊ฐ ํ์๋๋ค.
# (3) ํ์ ๋จ์ธ์ด ํ์ํ ๊ฒฝ์ฐ
- ํ์ ์ฒด์ปค๊ฐ ์ถ๋ก ํ ํ์ ๋ณด๋ค ๊ฐ๋ฐ์๊ฐ ์ง์ ํ๋จํ ํ์ ์ด ๋ ์ ํํ ๋ ์ฌ์ฉํ๋ค.
document.querySelector('#myButton').addEventListener('click', e => {
e.currentTarget; // ํ์
์ EventTarget
const button = e.currentTarget as HTMLButtonElement;
button; // ํ์
์ HTMLButtonElement
})
- ํ์
์คํฌ๋ฆฝํธ๋ DOM์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์
#myButton
์ด ๋ฒํผ ์๋ฆฌ๋จผํธ์ธ์ง ์์ง ๋ชปํ๋ค. - ๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ์
currentTarget
์ด ๊ฐ์ ๋ฒํผ์ด์ด์ผ ํ๋ ๊ฒ๋ ์์ง ๋ชปํ๋ค. - ๊ฐ๋ฐ์๋ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์์ง ๋ชปํ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์๋ ํ์ ๋จ์ธ์ ์ฐ๋ ๊ฒ์ด ํ๋นํ๋ค.
# (4) non-null assertion
const elNull = document.getElementById('foo'); // ํ์
์ HTMLElement | null
const el = document.getElementById('foo')!; // ํ์
์ HTMLElement
- ์ ๋ฏธ์ฌ๋ก ์ฐ์ธ
!
๋ฅผ ํตํด ํ์ ์ฒด์ปค๋ ์์ง ๋ชปํ์ง๋ง ๊ทธ ๊ฐ์ดnull
์ด ์๋๋ผ๊ณ ํ์ ํ ์ ์๊ฒ ๋๋ค.- ๋ง์ฝ ๊ทธ๋ ์ง ์๋ค๋ฉด,
null
์ธ ๊ฒฝ์ฐ๋ฅผ ์ฒดํฌํ๋ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํด์ผ ํ๋ค.
- ๋ง์ฝ ๊ทธ๋ ์ง ์๋ค๋ฉด,
# (5) unknown
ํ์
๋จ์ธ
- A๊ฐ B์ ๋ถ๋ถ ์งํฉ์ธ ๊ฒฝ์ฐ์ ํ์ ๋จ์ธ๋ฌธ์ ์ฌ์ฉํด ๋ณํํ ์ ์๋ค.
- ์ด๋ฌํ rule์ ์งํค์ง ์๋๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ฐ ์ด ๋
unknown
ํ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค. - ๋ชจ๋ ํ์
์
unknown
์ ์๋ธํ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด ํ์ ์ด ํฌํจ๋ ๋จ์ธ๋ฌธ์ ํญ์ ๋์ํ๋ค. unknown
๋จ์ธ์ ์์์ ํ์ ๊ฐ์ ๋ณํ์ ๊ฐ๋ฅ์ผ ํ์ง๋ง,unknown
์ ์ฌ์ฉํ ์ด์ ์ ์ด๋ ๋ฌด์ธ๊ฐ ์ํํ ๋์์ ํ๊ณ ์๋ค๋ ๊ฑธ ์ ์ ์๋ค.
# Item10. ๊ฐ์ฒด ๋ํผ ํ์ ํผํ๊ธฐ
'primitive'.charAt(3);
์ ๊ฐ์ ์ฝ๋์์charAt
์string
์ ๋ฉ์๋๊ฐ ์๋๋ฉด,string
์ ์ฌ์ฉํ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋ถ์ ์ผ๋ก ๋ง์ ๋์์ด ์ผ์ด๋๋ค.string
๊ธฐ๋ณธํ์๋ ๋ฉ์๋๊ฐ ์์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋String
๊ฐ์ฒด ํ์ ์ด ์ ์๋์ด ์๋ค.string
๊ธฐ๋ณธํ์charAt
๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋, ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธํ์String
๊ฐ์ฒด๋ก ๋ํ(wrap)ํ๊ณ , ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ๋ง์ง๋ง์ ๋ํํ ๊ฐ์ฒด๋ฅผ ๋ฒ๋ฆฐ๋ค.
- ๋ค๋ฅธ ๊ธฐ๋ณธํ์๋ ๋์ผํ๊ฒ ๊ฐ์ฒด ๋ํผ ํ์
์ด ์กด์ฌํ๋ค.
number
์๋Number
,boolean
์๋Boolean
๋ฑ...- ์ด ๋ํผ ํ์
๋ค ๋๋ถ์ ๊ธฐ๋ณธํ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์ ์ ๋ฉ์๋(
String.fromCharCode
๊ฐ์)๋ ์ฌ์ฉํ ์ ์๋ค. - ๊ทธ๋ฌ๋ ๋ณดํต์ ๋ํผ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ํ์๊ฐ ์๋ค.
- ํ์
์ ์ ์ธํ ๋ ๊ฐ์ฒด ๋ํผ ํ์
์ผ๋ก ์์ฑํ์ง ์๋๋ก ์ฃผ์ํ์.
- ๋๋ถ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ ๊ณตํ๋ ํ์ ์ ์ธ์ ์ ๋ถ ๊ธฐ๋ณธํ ํ์ ์ผ๋ก ๋์ด ์๋ค.
- ๊ธฐ๋ณธํ ํ์
์ ๊ฐ์ฒด ๋ํผ์ ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์
์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธํ ํ์
์ ๊ฐ์ฒด ๋ํผ์ ํ ๋นํ๋ ์ ์ธ์ ํ์ฉํ๋ค.
- ๊ทธ๋ฌ๋ ๊ธฐ๋ณธํ ํ์ ์ ๊ฐ์ฒด ๋ํผ์ ํ ๋นํ๋ ๊ตฌ๋ฌธ์ ์คํดํ๊ธฐ ์ฝ๊ณ , ๊ตณ์ด ๊ทธ๋ ๊ฒ ํ ํ์๋ ์๋ค.
- ๊ทธ๋ฅ ๊ธฐ๋ณธํ ํ์ ์ ์ฌ์ฉํ์.