자바스크립트는 에러에 대해 너무 관대하다. 타입스크립트를 통해 이러한 에러를 잡을 수 있고 사전에 방지할 수 있다.
javascript이 에러로 인식하지 않는 에러
// 예시 1
[1,2,3,4] + false // '1,2,3,4false'
// 예시 2
function divide(a, b) {
return a / b;
}
divide('xxxxx') // 'NaN'
// 예시 3
const player = {
age: 12;
} //
player.hello() // js는 에러가 날지 몰랐기 때문에 코드를 실행시켜버렸음
let a : number[] = [1, 2]
let b : string[] = ["i1", "i2"]
let c : boolean[] = [true]
const player : {
name: string,
age?:number // optional chaining, age는 있을 수 있고 없을 수도 있다는 것을 알려줌
} = {
name:"kyoorim"
}
타입을 중복해서 지정해줄 필요가 없음! 타입 재사용 가능!
type Player = {
name: string,
age?:number
}
const kyoorim : Player = {
name: "Kyoorim"
}
const kyoo : Player = {
name: "Kyoo",
age:12
}
function playerMaker(name:string) : Player {
return {
name:name
}
} // function playerMaker(인수) 의 결과값이 Player라고 해석! 콜론의 위치!!
const nico = playerMaker("nico")
nico.age = 12;
화살표 함수인 경우
const playerMaker = (name:string) : Player => ({name})
readonly가 쓰인 인수는 수정이 불가능 함! (보호장치)
// 예시 1
type Player = {
readonly name: string,
age?: number
}
// 예시 2
const numbers: readonly number[] = [1,2,3,4]
numbers.push(1) // push가 readonly number[]타입에 존재하지 않으므로 에러로 인식함
반면 filter
, map
메소드는 사용할 수 있음 => 기존 array를 바꾸지 않기 때문(immutability)
정해진 갯수의 인자를 순서에 맞는 타입으로 받는 array를 지정할 수 있음
const player : [string, number, boolean] = ["kyoorim", 12, true]
typescript로부터 빠져나오고 싶을 때 => typescript의 보호장치를 잃어벌게 됨
"비어있는 것". 아무것도 return하지 않는 함수를 대상으로 함. 지정해줄 필요는 없고 TS에서 return값이 없는 경우 알아서 void
로 인식함
function hello() {
console.log('x')
} // function hello() : void
1/ return값이 없고 오류를 발생시키는 함수인 경우
function hello() : never {
throw new Error("error")
}
2/ 타입이 2가지인 경우에 절대 실행되면 안되는 경우를 보여줌
function hello(name: string|number) {
if(typeof name === "string") {
name // name:string인 경우
} else if (typeof name === "number") {
name // name:number인 경우
} else {
name // name:never인 경우 => name의 타입은 string or number라고 지정해줬으므로 그 이외의 경우는 발생해서는 안됨
}
}
어떤 타입인지 모르는 변수를 받을 때 ex)API로부터 응답을 받는 데 그 응답의 타입을 모르는 경우 => 타입 확인작업을 반드시 해야함 !!!
let a : unknown;
let b = a + 1 // 이러면 오류가 생김
if(typeof a === 'number'){
let b = a + 1 // 이건 허용됨. unknown인 변수의 타입을 먼저 확인한 후 진행할 수 있게 해줌
}
if(typeof a === "string") {
let b = a.toUpperCase();
}