# ๐ Item34 ~ 38
# Item34. ๋ถ์ ํํ ํ์ ๋ณด๋ค๋ ๋ฏธ์์ฑ ํ์ ์ ์ฌ์ฉํ๊ธฐ
- ํ์
์์ ์ฑ์์ ๋ถ์พํ ๊ณจ์ง๊ธฐ๋ ํผํด์ผ ํ๋ค. ํ์
์ด ์๋ ๊ฒ๋ณด๋ค ์๋ชป๋ ๊ฒ ๋ ๋์๋ค.
- ๋ถ์พํ ๊ณจ์ง๊ธฐ(uncanny valley) : ํ์ ์ ์ธ์์ ์ด์คํ๊ฒ ์๋ฒฝ์ ์ถ๊ตฌํ๋ ค๋ค๊ฐ ์คํ๋ ค ์ญํจ๊ณผ๊ฐ ๋ฐ์ํ๋ ๊ฒ
- ์ ํํ๊ฒ ํ์
์ ๋ชจ๋ธ๋งํ ์ ์๋ค๋ฉด, ๋ถ์ ํํ๊ฒ ๋ชจ๋ธ๋งํ์ง ๋ง์์ผ ํ๋ค. ๋ํ
any
์unknown
๋ฅผ ๊ตฌ๋ณํด์ ์ฌ์ฉํด์ผ ํ๋ค. - ํ์ ์ ๋ณด๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง๋ค์๋ก ์ค๋ฅ ๋ฉ์์ง์ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค. ์ ํ๋๋ฟ๋ง ์๋๋ผ ๊ฐ๋ฐ ๊ฒฝํ๊ณผ๋ ๊ด๋ จ๋๋ค.
# โ unknown
vs any
vs never
# โ๏ธ unknown
- Typescript์ ํ ํ์
์ด๋ฉฐ, Typescript์ ์กด์ฌํ๊ณ , ์กด์ฌํ ์ ์๋ ๋ชจ๋ ํ์
๋ค์ ํฌํจํ์ฌ ์ด๋ค ๊ฐ์ด๋ ๊ฐ์ง ์ ์์ง๋ง, ๊ทธ๋ก ์ธํด ๋ชจ๋ ํ์
์ด ๊ณตํต์ ์ผ๋ก ํ ์ ์๋ ์ฐ์ฐ ์ธ์๋ ํ ์ ์๋ ๊ฒ์ด ์๋ค.
- ๊ทธ๋์ ์ด ํ์ ๋ณ์๋ ์ฌ์ฉํ ๋ ์ด๋ค ํ์ ์ธ์ง ๋ค์ ๋ช ์ํด์ค์ผ ํ๋ค.
- ๋ํ ์ด ํ์
๋ณ์๋ ํ์
๊ฒ์ฌ๊ฐ ๋ ํ์๋ ํ์
์ ๋ช
์ํด์ฃผ์ง ์์๋ ๋๋ค.
- ์๋ฅผ ๋ค์ด
if
์กฐ๊ฑด๋ฌธ์์ ์๊ฒฉํ ๋น๊ต๋ฅผ ํตํด ํต๊ณผํ ๊ฒฝ์ฐ ๊ทธ ์์ ์คํ๋ฌธ์์๋ ๋ณ๋์ ํ์ ๋ช ์๋ฅผ ํ์ง ์์๋ ๋๋ค.
- ์๋ฅผ ๋ค์ด
let value: unknown = 'wow';
value = 123; // unknown ํ์
์ ์ด๋ค ํ์
์ ๊ฐ์ด๋ ํ ๋น, ์ฌํ ๋น ๋ชจ๋ ๊ฐ๋ฅ
const value2: number = value; // error! (value ๋ณ์์ ํ์
์ด ๋ช
ํํ์ง ์์ผ๋ฏ๋ก number ํ์
๋ณ์์ ํ ๋น ๋ถ๊ฐ๋ฅ)
const value3: number = (value as number); // ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ ๊ฒ ํ์
๋ช
์๋ฅผ ํด์ค์ผ ํจ
# โ๏ธ any
- ํ์ ๊ฒ์ฌ๋ฅผ ํตํด ํญ์ ๋ง์กฑํ๋ฉฐ ์ด๋ค ๊ฐ์ด๋ ๋ฐ๋ก ๋์ ํ๊ณ ์ฌ์ฉํ ์ ์๋ ๋ง๋ฒ๊ณผ ๊ฐ์ ํ์ ์ด๋ค.
- ํ์ ๊ฒ์ฌ๋ฅผ ํญ์ ๋ง์กฑํ๋ฏ๋ก ์๋์น ์์ ํ ๋ณํ์ด๋ ์ ํ ์์ํ์ง ๋ชปํ ์๋๋์ง ์์ ํ์ ์ ๊ฐ์ด ๋์ ๋๋ ๋ฑ ์ฌ๋ฌ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ผ์ผ์ผ ์์ ์ฑ์ด ๋ฎ์์ง ์ ์์ผ๋ฏ๋ก ์กฐ์ฌํด์ผ ํ๋ค.
# โ๏ธ never
unknown
ํ์ ๊ณผ ๋ฐ๋๋กnever
ํ์ ์ ๋ชจ๋ ํ์ ์ ํ์ ํ์ ์ด๋ค. ๊ทธ๋์ ์ด๋ค ๋ค๋ฅธ ๊ฐ๋never
ํ์ ์ ํ ๋นํ ์ ์๋ค.
// ๋ชจ๋ ์ปดํ์ผ ์๋ฌ ๋ฐ์
const first: never = 123;
const second: never = 'wow';
never
ํ์ ์ฌ์ฉ ์์
// 1) ์ด๋ค ๊ฐ๋ ๋ฐํํ์ง ์์ ํจ์์์์ ๋ฐํ ํ์
const showError = (message: string): never => {
throw new Error(message);
}
// 2) ํน์ ํ์
๊ฐ์ ํ ๋น๋ฐ์ง ์๋๋ก ํ๋ ํ์
์์
// ์๋ ์์๋ string ํ์
์ธ ๊ฒฝ์ฐ๋ never๋ก ์ถ๋ก ํ์ฌ string ํ์
์ ๊ฐ์ด ํ ๋น๋์ง ๋ชปํ๋๋ก ํ ์ ์๋ค.
type NonString<T> = T extends string ? never : T;
๐ Reference
- https://xo.dev/typescript-unknown-any-never/
# Item35. ๋ฐ์ดํฐ๊ฐ ์๋, API์ ๋ช ์ธ๋ฅผ ๋ณด๊ณ ํ์ ๋ง๋ค๊ธฐ
- ๋ช ์ธ๋ฅผ ์ฐธ๊ณ ํด ํ์ ์ ์์ฑํ๋ฉด ํ์ ์คํฌ๋ฆฝํธ๋ ์ฌ์ฉ์๊ฐ ์ค์๋ฅผ ์ค์ผ ์ ์๊ฒ ๋์์ค๋ค.
- ๋ฐ๋ฉด์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ๊ณ ํด ํ์ ์ ์์ฑํ๋ฉด ๋์์ ์๋ ๋ฐ์ดํฐ๋ค๋ง ๊ณ ๋ คํ๊ฒ ๋๋ฏ๋ก ์๊ธฐ์น ์์ ๊ณณ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
# Item36. ํด๋น ๋ถ์ผ์ ์ฉ์ด๋ก ํ์ ์ด๋ฆ ์ง๊ธฐ
- ๊ฐ๋ ์ฑ์ ๋์ด๊ณ , ์ถ์ํ ์์ค์ ์ฌ๋ฆฌ๊ธฐ ์ํด์ ํด๋น ๋ถ์ผ์ ์ฉ์ด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ๋์ผํ ์๋ฏธ๋ฅผ ๋ํ๋ผ ๋๋ ๊ฐ์ ์ฉ์ด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ๊ธ์ ์ธ ๋๋ ๋ง์ ํ ๋, ๊ฐ์ ๋จ์ด๋ฅผ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ฉด ์ง๋ฃจํ ์ ์๊ธฐ ๋๋ฌธ์ ๋์์ด๋ฅผ ์ฌ์ฉํ๋ค.
- ๋์์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธ์ ์ฝ์ ๋๋ ์ข์ ์ ์์ง๋ง, ์ฝ๋์์๋ ์ข์ง ์๋ค.
- ์ ๋ง๋ก ์๋ฏธ์ ์ผ๋ก ๊ตฌ๋ถ์ด ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ์๋ง ๋ค๋ฅธ ์ฉ์ด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
data
,info
,thing
,item
,object
,entity
๊ฐ์ ๋ชจํธํ๊ณ ์๋ฏธ ์๋ ์ด๋ฆ์ ํผํด์ผ ํ๋ค.- ๋ง์ฝ
entity
๋ผ๋ ์ฉ์ด๊ฐ ํด๋น ๋ถ์ผ์์ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค๋ฉด ๊ด์ฐฎ๋ค. - ๊ทธ๋ฌ๋ ๊ท์ฐฎ๋ค๊ณ ๋ฌด์ฌ์ฝ ์๋ฏธ ์๋ ์ด๋ฆ์ ๋ถ์ฌ์๋ ์ ๋๋ค.
- ๋ง์ฝ
- ์ด๋ฆ์ ์ง์ ๋๋ ํฌํจ๋ ๋ด์ฉ์ด๋ ๊ฐ์ ๋ฐฉ์์ด ์๋๋ผ ๋ฐ์ดํฐ ์์ฒด๊ฐ ๋ฌด์์ธ์ง๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
- ์๋ฅผ ๋ค์ด
INodeList
๋ณด๋ค๋Directory
๊ฐ ๋ ์๋ฏธ์๋ ์ด๋ฆ์ด๋ค. Directory
๋ ๊ตฌํ์ ์ธก๋ฉด์ด ์๋๋ผ ๊ฐ๋ ์ ์ธ ์ธก๋ฉด์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์๊ฐํ๊ฒ ๋๋ค.- ์ข์ ์ด๋ฆ์ ์ถ์ํ์ ์์ค์ ๋์ด๊ณ ์๋์น ์์ ์ถฉ๋์ ์ํ์ฑ์ ์ค์ฌ ์ค๋ค.
- ์๋ฅผ ๋ค์ด
# Item37. ๊ณต์ ๋ช ์นญ์๋ ์ํ๋ฅผ ๋ถ์ด๊ธฐ
- ํ์
์คํฌ๋ฆฝํธ๋ ๊ตฌ์กฐ์ ํ์ดํ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ๊ฐ์ ์ธ๋ฐํ๊ฒ ๊ตฌ๋ถํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- ๊ฐ์ ๊ตฌ๋ถํ๊ธฐ ์ํด ๊ณต์ ๋ช ์นญ์ด ํ์ํ๋ค๋ฉด ์ํ๋ฅผ ๋ถ์ด๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.
- ์ํ ๊ธฐ๋ฒ์ ํ์ ์์คํ ์์ ๋์ํ์ง๋ง ๋ฐํ์์ ์ํ๋ฅผ ๊ฒ์ฌํ๋ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
# Item38. any
ํ์
์ ๊ฐ๋ฅํ ํ ์ข์ ๋ฒ์์์๋ง ์ฌ์ฉํ๊ธฐ
# (1) ํจ์์์ any
ํ์
์ฌ์ฉํ๊ธฐ
any
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์๋ค.
function f1() {
const x: any = expressionReturningFoo(); // Don't!
processBar(x);
}
function f2() {
const x = expressionReturningFoo()
processBar(x as any); // Do!
}
- ์ ๋ฐฉ๋ฒ ์ค ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑํด์ผ ํ๋ ์ด์ ๋
any
ํ์ ์ดprocessBar
ํจ์์ ๋งค๊ฐ๋ณ์์์๋ง ์ฌ์ฉ๋ ํํ์์ด๋ฏ๋ก ๋ค๋ฅธ ์ฝ๋์๋ ์ํฅ์ ๋ฏธ์น์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. any
์ ์ฌ์ฉ ๋ฒ์๋ฅผ ์ข๊ฒ ์ ํํด์ผany
ํ์ ์ด ์ ํ ์ฐ๊ด์๋ ํจ์ ๋ฐ๊นฅ์ผ๋ก ์ํฅ์ ๋ฏธ์น์ง ์๊ฒ ๋๋ค.- ๋น์ทํ ๊ด์ ์์, ํ์
์คํฌ๋ฆฝํธ๊ฐ ํจ์์ ๋ฐํ ํ์
์ ์ถ๋ก ํ ์ ์๋ ๊ฒฝ์ฐ์๋ ํจ์์ ๋ฐํ ํ์
์ ๋ช
์ํ๋ ๊ฒ์ด ์ข๋ค.
- ํจ์์ ๋ฐํ ํ์
์ ๋ช
์ํ๋ฉด
any
ํ์ ์ด ํจ์ ๋ฐ๊นฅ์ผ๋ก ์ํฅ์ด ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.
- ํจ์์ ๋ฐํ ํ์
์ ๋ช
์ํ๋ฉด
# (2) ๊ฐ์ฒด์์ any
ํ์
์ฌ์ฉํ๊ธฐ
const config: Config = {
a: 1,
b: 2,
c: {
key: value,
// ~~~ 'foo' ์์ฑ์ด 'Foo' ํ์
์ ํ์ํ์ง๋ง, 'Bar' ํ์
์๋ ์์ต๋๋ค.
}
}
- ๊ฐ์ฒด์ ๊ฒฝ์ฐ์๋
config
๊ฐ ์์ฒด๋ฅผas any
๋ก ์ ์ธํ์ฌ ์ค๋ฅ๋ฅผ ์ ๊ฑฐํ ์ ์์ง๋ง ๊ฐ์ฒด ์ ์ฒด๋ฅผany
๋ก ๋จ์ธํ๋ฉด ๋ค๋ฅธ ์์ฑ๋ค(a
์b
) ์ญ์ ํ์ ์ฒดํฌ๊ฐ ๋์ง ์๋ ๋ถ์์ฉ์ด ์๊ธด๋ค. - ๊ทธ๋ฌ๋ฏ๋ก ์๋ ์ฝ๋์ฒ๋ผ ์ต์ํ์ ๋ฒ์์๋ง
any
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
const config: Config = {
a: 1,
b: 2,
c: {
key: value as any,
}
}