1. 타입별
1) string, number, boolean
const name: string = "sj"
const age: number = 26
const hasGirlFriend: boolean = false
2) array
① 배열에 들어가는 자료형이 똑같은 경우
const nickname: string[] = ["a","b","c","d"]
const age: number[] = [1,2,3,4]
② 배열에 들어가는 자료형이 여러 개인 경우
const nickname: (string|number)[] = ["a",1,"b",2]
const age: (number|boolean)[] = [1,true,2,false]
3) object
const myInfo: {
name: string
age: number
hasGirlFriend: boolean
}= {
name: "sj",
age: 26,
hasGirlFriend: false
}
4) function
function getMyNickname(name: string):string{
const nickname = `cool ${name}`
return nickname
}
const getMyNickname = (name?: string):string => {
const nickname = `cool ${name}`
return nickname
}
- return하지 않는 함수라면 void 타입을 준다.
- optional인 파라미터라면 ?를 추가하던, Union으로 undefined을 추가한다.
5) Union
const age: string|number = 26
6) 소 정리

- 그런데 사실 Union 타입이나 함수의 파라미터가 아닌 이상 굳이 변수에 곧바로 타입 지정을 해줄 필요는 없다.
- 왜냐하면 타입스크립트가 자동으로 초기 할당되는 값의 타입을 그 변수의 타입으로 지정하기 때문이다! 확실치 않으면 그 변수에 호버해보면 어떤 타입을 가지는 지 나온다.
2. 타입변수(type alias)
type AgeType = string | number
const age: AgeType = 26
- 기타 다른 자료형들도 마찬가지이고 타입변수를 Union으로 쓸 수도 있다.
- 그러나 객체와 함수는 알아두어야 할 점이 있다.
1) 선언함수에서는 타입변수 불가
- 단 함수에서 알아두어야 할 점은 선언함수에서는 타입변수를 사용할 수 없어 화살표함수나 함수표현식을 사용해야 한다.
type GetMyNickNameType = (name:string|number) => string;
function getMyNickname(name){
const nickname = `cool ${name}`
return nickname
}
const getMyNickname:GetMyNickNameType = function(name){
const nickname = `cool ${name}`
return nickname
}
const getMyNickname:GetMyNickNameType = (name) => {
const nickname = `cool ${name}`
return nickname
}
2) 객체
① [key: string]
- 만약 몇 개의 속성이 들어올 지 모른다면 [key: string]으로 무한대의 key를 받을 수 있다.
type MemberType = {
[key: string]: string
}
const member :MemberType = {
lastName: "choi",
FirstName: "sj",
hobby: "walk",
job: "student"
~~~
}
② 객체는 type보단 interface를 더 선호
interface IStudent{
name: string
}
interface ITeacher extends IStudent{
subject: string
}
const student: IStudent = {name: "choi"}
const teacher: ITeacher = {name: "park", subject: "korean"}
- 객체의 경우 type보단 interface를 많이 쓴다.
- interface는 extends를 사용한 확장이 가능하다!
- extends는 &와 용도는 비슷해보이나 &는 두 타입을 전부 만족해야 한다는 뜻임에 비해 extends는 기존 존재하는 interface를 복사하고 추가적인 속성을 더하는 것이다.
interface IStudent{
name: string
}
interface IStudent{
age: number
}
IStudent
- interface는 타입변수명 중복선언이 가능하여 중복값끼리 타입이 합쳐진다.
- 그러나 type은 타입변수명 중복선언이 불가하다.
③ readonly(보다는 리터럴 추천)
type FriendsName = {
readonly name: string
}
const friends :FriendsName = {
name: "park"
}
- 처음 부여한 값이 readonly로 굳어진다.
- 자바스크립트의 경우에는 객체를 const 변수에 할당해도 객체의 속성값을 문제없이 수정할 수 있다.
- 타입스크립트는 readonly를 통해 처음 할당한 값과 다른 값을 넣으려고 하면 에러를 낸다.
- 그런데 이렇게 쓸 바에는 리터럴 타입으로 타입에 바로 ‘park’를 넣으면 될 것 같은데?