ํ์ ์คํฌ๋ฆฝํธ๋ ํ์ ์ด ์ถ๊ฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ผ ๋ฟ๋ง ์๋๋ผ ์ธํฐํ์ด์ค, ์ ๋ค๋ฆญ๋ฑ ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ ๋ค์ํ ๊ตฌ๋ฌธ๋ค์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๊ฐ์ ์ ์ธ ํ์
์ ์ธ์ด ๊ท์ฐฎ๋๋ผ๋ ์ฅ๊ธฐ์ ์ธ ๊ด์ ์์ ๋ณผ ๋ ์์ฐ์ฑ์ด ๋์ ๋ ์ ๋๋ก ํฅ์๋ฉ๋๋ค.
์ค์๋ก ๋ณ์ํ์
์ ์ซ์์์ ๋ฌธ์์ด๋ก ๋ฐ๊พผ๋ค๋ฉด ์ปดํ์ผ๋ฌ ๋จ๊ณ์์ ์ด ์ค๋ฅ๋ฅผ ์ก์ ์ ์๊ธฐ ๋๋ฌธ!
SW ๊ฐ๋ฐ์๋ ํ์
์คํฌ๋ฆฝํธ์ปดํ์ผ๋ฌ๋ก ํ์
์ ๋ช
์์ ๋๋ ์์์ ์ผ๋ก ์ ์ธ ํ ์ ์์.
๋ช
์์ : ์ฝ๋์ ์ง์ ๊ตฌ์ฒด์ ์ผ๋ก ํํํ๋ค๋ ๋ป
์์์ : ์ฝ๋๋ก ํํํ์ง ์์๋ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ์ฒ๋ฆฌํ๋ค๋ ๋ป
ํ์ ์คํฌ๋ฆฝํธ๋ ๋ณ์ ์ ์ธ ํ ํ์ ๊ณผ ํจ๊ผ ์ธ๋ฏธ์ฝ๋ก ์ ๋ถ์.
let firstName: string;
let age: number;
string, number, boolean,
symbol : Symbol์์ฑ์๋ฅผ ํธ์ถํด ์์ฑ๋ ๊ณ ์ ๊ฐ
any : ๋ชจ๋ ํ์
์ ํ์ฉํ๋ ํ์
, ์ฝ๋๋ฅผ ์ฐ๋ ๋์ ์ ํด์ง์ง ์์ ๋ณ์๋ฅผ ์ง์ ํ ์ ์๋ค.
unknown : any์ ๋น์ทํ์ง๋ง ๋จผ์ ํ์
์ ์ง์ ํ๊ฑฐ๋ ์ขํ์ง ์์ผ๋ฉด ์กฐ์์ด ํ์ฉX.
never : ๋๋ฌํ ์ ์๋ ์ฝ๋
void : ๊ฐ์์
Symbol์ ๊ฐ์ฒด ํ๋กํผํฐ์ ๊ณ ์ ๊ฐ์ ๊ฐ์ง ํค๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋จ.
// 2_1.ts
const ord = Symbol('orderId');
const myOrder = { // ๊ฐ์ฒดํ๋กํผํฐ๋ก Symbol์ฌ์ฉํ๊ธฐ
ord:"123"
}
console.log(myOrder['ord']); // 123 ์ถ๋ ฅ๋จ.
ํ์ ์คํฌ๋ฆฝํธ๋ null๊ณผ undefined ํ์ ์ ๊ฐ์ง.
null๊ณผ undefined๋ฅผ ๋ชจ๋ ๋ณ์์ ํ ๋นํ ์ ์์ง๋ง, ์ฌ๋ฌํ์ ๊ณผ ์์ด ์ฌ์ฉ๋๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
function getName(): string|null{ ... }
null์ ๋ช ์์ ์ผ๋ก ์์ฑํ์ฌ ์ฝ๋ ๊ฐ๋ ์ฑ์ ํฅ์์ํด.
์ซ์, ํ ์คํธ, ๋ถ์ธ ๋๋ Customer๊ฐ์ ์ปค์คํ ํ์ ๊ฐ์ ํ ๋น.
anyํ์ ์ ์ฌ์ฉํ๋ฉด ํ์ ์ฒดํฌ์ ์ฅ์ ์ ์๊ณ ์ฝ๋ ๊ฐ๋ ์ฑ๋ ๋จ์ด์ ธ ๋๋๋ก ์ฌ์ฉ X
์ ๋ ๋ฐํ์ ํ์ง ์๋ ํจ์์ ์ฌ์ฉ.
ex) ์ ๋๋ก ์คํ์ด ์ข
๋ฃ๋์ง ์๋ ํจ์๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ธฐ ์ํด์๋ง ์กด์ฌํ๋ ํจ์
//2_2.ts
const logger = () =>{
while(true){ // ํจ์๊ฐ ์ข
๋ฃ๋์ง ์๊ณ ๊ณ์ ์คํ๋จ.
console.log('์๋ฒ๊ฐ ์คํ ์ค ์
๋๋ค.');
}
}
์์ฑํ ํจ์๋ฅผ ๋ณ์์ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ ํจ์ ํํ์์ด๋ผ๊ณ ํ๋๋ฐ ์ด ์ญ์ ํ์
์ ๋ฐํํจ.
์ ํจ์์ ํ์
์ never์
๋๋ค.
๋ณ์ ์ ์ธ์ด ์๋๋ผ ๊ฐ์ ๋ฐํํ์ง ์๋ ํจ์๋ฅผ ์ ์ธํ๋๋ฐ ์ฌ์ฉ.
function logError(errorMessage: string): void{
console.error(errorMessage);
}
never์ ๋ค๋ฅด๊ฒ voidํจ์๋ ์คํ์ ์๋ฃํ์ง๋ง ๊ฐ์ ๋ฐํ ์ํจ.
โ ๋ฐํ์ ์ค์ ํจ์ ๋ณธ๋ฌธ์ return์ด ์๋๊ฒฝ์ฐ undefined๋ฅผ ๋ฐํํ๋๋ฐ void๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์ ๊ฐ์ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
ํ์ ์คํฌ๋ฆฝํธ์ ํ์ ํ๊ธฐ๋ ์ ํ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ํ๊ธฐ๊ฐ ์์ผ๋ฉด ๊ฒ์ฌ๊ธฐ๋ ํ์ ์ ์ ์ถํ๋ค.
// 2_3.ts
const age = 25;
function getTax(income: number):number{
return income * 0.15;
}
let yourTax = getTax(50000);
age์ yourTax์ ๊ฒฝ์ฐ ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์ ์ถํ๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ํ์ ์ ๋ค์ ํ๊ธฐํ ํ์๊ฐ ์์ต๋๋ค.
๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
let name3: 'John Smith';
์ด ๋ณ์๋ John Smith๋ผ๋ ๋ฆฌํฐ๋ด ํ์ ์ ๊ฐ์ง๊ณ , ๋ณ๊ฒฝ๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
let name3: 'John Smith';
name3 = 'Mary Lolu'; // error: Type 'Mary Lolu'is not assignable to type "John Smith"
๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋๋ฏ๊ณ , ์ ๋์จ๊ณผ ์ด๊ฑฐํ์ ์ ์ฌ์ฉํจ.
์ด๊ธฐ๊ฐ ์์ด ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ anyํ์ ์ผ๋ก ์ ์ถํ๋๋ฐ ์ด์ฒ๋ผ ์ ์ถํ๋ ๊ฒ์ ํ์ ํ์ฅ์ด๋ผ๊ณ ํจ.
let productId;productId = null;productId = undefined;
ํ์
์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๋ anyํ์
์ผ๋ก ์ ์ถํ๊ณ , null๊ณผ undefined๊ฐ์ ํ ๋นํฉ๋๋ค.
๋ฐ๋ผ์ productId์ ํ์
์ any๊ฐ๋ฉ๋๋ค.
-- strictNullCheck ์ต์
์ ํตํด ์ ํด์ง ๋ณ์์ null์ด ์
๋ ฅ๋๋๊ฑธ ๋ง์ต๋๋ค.
์ฝ๋ ์ค๋ํซ์์ ์ ์ต์
์ ์ ์ฉํ๋ฉด productId ํ์
์ number๊ฐ ๋๋ฉฐ, ๋๋ฒ์งธ์ ์ธ๋ฒ์งธ์ค์ ์ปดํ์ผ์ด ๋์ง ์์ต๋๋ค.
undefined๊ฐ์ ์ก๋๋ฐ๋ ๋์๋จ.
let productId;productId = null; // ์ปดํ์ผ์ค๋ฅproductId = undefined; // ์ปดํ์ผ ์ค๋ฅ
ํ์ ์คํฌ๋ฆฝํธ ํจ์์ ํจ์ํํ์์ ํ๋ผ๋ฏธํฐ ํ์ ๊ณผ ๋ฐํ๊ฐ์ ๋ช ์์ ์ผ๋ก ์ ์ธํฉ๋๋ค.
// 2_4.js
function calcTax(state, income, dependents){
if(state ==='NY') return income * 0.06 - dependents * 500;
else if(state ==='NJ') return income * 0.05 - dependents * 300;
}
// let tax = calcTax('NJ', 50000, 2); // 1900
let tax = calcTax('NJ', 50000, 'two'); // NaNconsole.log(tax);
ํจ์์ ํธ์ถ์ ์๋ ์ ์ฝ๋์ ๋ฌธ์ ์ ์ ์ ์ ์๋ค.
function calcTax(state:string, income:number, dependents:number):number{
if(state ==='NY') return income * 0.06 - dependents * 500;
else if(state ==='NJ') return income * 0.05 - dependents * 300;
}
// let tax:number = calcTax('NJ', 50000, 'two');
// Type Errorlet tax:string = calcTax('NJ', 50000, 'two'); console.log(tax);
๋ฐํ๊ฐ์ number์ด๊ธฐ ๋๋ฌธ์ tax๊ฐ ์ซ์๊ฐ ์๋๋ผ๋ฉด, ์ปดํ์ผ๋ฌ๋ ์ค๋ฅ๋ฅผ ๋ณด๋ด ํ์ ์ค์๋ฅผ ๋ฐฉ์ง.
โ state๊ฐ NY์ NJ์ ๋ํด์๋ง ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ undefined๋ฅผ ๋ฐํํฉ๋๋ค.
ํ์ง๋ง ๊ฒฝ๊ณ ๋ฉ์ธ์ง๋ ํ์ํ์ง ์์ต๋๋ค.
์๋์ ๊ฐ์ด ์์ ํ์ฌ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
function calcTax(state:string, income:number, dependents:number) : number | undefined
์ ๋์จ์ OR์ฐ์ฐ์์ฒ๋ผ ๋ณ์์ ์ง์ ํ ์ ์๋ ํ์ ์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ ์ฌ์ฉ.
let padding: string | number
any๋ฅผ ์ฌ์ฉํด๋๋์ง๋ง, ๊ทธ๋ฌ์ง ์๋ ์ด์ ๊ฐ ์๋ค.
์๋ ์ฝ๋๋ ์ฃผ์ด์ง ๋ฌธ์์ด์ ์ผ์ชฝ ํจ๋ฉ๊ฐ์ ์ถ๊ฐํ๋ ํจ์.
์ซ์ํ์
์ด๋ฉด value ์์ ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ์ถ๊ฐํ๊ณ , ๋ฌธ์์ด ํ์
์ด๋ฉด padding์ ๋ฌธ์์ด์ ์ด์ด ๋ถ์ฌ ๋ฐํ.
//2_6.ts, 2_7
function padLeft(value: string, padding: any):string{
if(typeof padding === 'number'){
return Array(padding + 1).join('') + value;
}
if(typeof padding === 'string'){
return padding + value;
}
throw new Error(`Expected string or number, got '${padding}'`);
}
console.log(padLeft('Hello World', 4)); // Hello World ๋ฐํ
console.log(padLeft('Hello World', 'John says')); // John says Hello World
console.log(padLeft('Hello World', true)); // ๋ฐํ์ ์ค๋ฅ ๋ฐ์
์กฐ๊ฑด๋ฌธ์ผ๋ก ๋ณ์ ํ์ ์ ์ธ๋ถํํ๋ ๊ฒ์ ํ์ ์ถ์๋ผ๊ณ ํ๋ค.
2.5์์ typeof ํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํด ๋ ์ด์์ ํ์ (number | undefined)์ ํ์ฉํ๋๋ก ๋ฒ์๋ฅผ ์ถ์ํ์ต๋๋ค.
instanceof ๋ ์ปค์คํ ํ์ ๊ณผ ํจ๊ป ์ฌ์ฉ๋จ. ์ค์ ๊ฐ์ฒด ํ์ ์ ํ์ธํจ.
typeof๋ ํ์ ์คํฌ๋ฆฝํธ ๋ด์ฅ ํ์ ์ ์ฌ์ฉ๋๋ฉฐ, instanceof๋ ์ฌ์ฉ์๊ฐ ๋ง๋ ํ์ ์ ์ฌ์ฉ๋๋ค๋ ์ฐจ์ด๊ฐ ์๋ค.
function padLeft2_8(value: string, padding: string | number):string{
if(typeof padding === 'number'){
return Array(padding + 1).join('') + value;
}
if(typeof padding === 'string'){
return padding + value;
}
}
// console.log(padLeft2_8('Hello World', true)) // ์ปดํ์ผ์ค๋ฅ
string๊ณผ number ์ ๋์จ์ผ๋ก ๋ฐ๊พธ์ด ์์ธ์ฒ๋ฆฌ์ ํ์์ฑ์ด ์ฌ๋ผ์ง๋๋ค.
์ ์ฝ์๋ฌธ ์ฒ๋ผ ์
๋ ฅ ์ true์ ๋นจ๊ฐ์ค์ด ๋์ด๋ฉด์ ์ปดํ์ผ์ค๋ฅ ๋ฐ์.
โ ๋ณ์๊ฐ ๋ ๊ฐ ์ด์์ ํ์ ์ ๊ฐ์ง ๊ฒฝ์ฐ any๋ง๊ณ ์ ๋์จ ์ฌ์ฉ.
let padding: string | number
๋ณ์๋ฅผ ํ์ ๋ณ๋ก ๋๋ ์ ์ ์ธ์ด ๊ฐ๋ฅ
let paddingStr: string | let paddingNum: number;
function paddingLeft2_9(value: string, padding: string | number): string{
if(typeof padding === 'number') return Array(padding+1).join('')+value;
if(typeof padding === 'string') return padding + value;
else return padding; // else๋ธ๋ก์ ์คํ์๋จ.
}
neverํ์
์ ์์์ ๋งํ๋ฏ์ด ์ด๋ค ํ์
๊ณผ๋ ํธํ๋์ง ์๋ ํ์
.
๋
ผ๋ฆฌ์ ์ผ๋ก ๋๊น์ง ์คํ๋ ์ ์๋ ํจ์์ ๋ฐํ ๊ฐ์ neverํ์
์ด ๋ฉ๋๋ค.
์ ์ฝ๋์ ๊ฒฝ์ฐ string | number ์ธ์ ํ์ ์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ else์ ์ padding์ never๋ก ์ ์ถ๋ฉ๋๋ค. (padding์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค ํ์ ํ์ธ ๊ฐ๋ฅ)
any๋ฅผ ์ฌ์ฉํ์ง์๊ณ ์ ๋์จ์ ์ฌ์ฉํ๋ฉด ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๊ฐ ๋ฐํ์ ๋์ค padLeft()๊ฐ ์๋ชป ํธ์ถ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ฐ์งํด ์ค๋ฅ๋ฅผ ๋ฐ๋ก ํด๊ฒฐ๊ฐ๋ฅ ํ๋ค