2025년 2월 26일
배열 타입을 정의하는 방식은 두가지임
// 배열
let numArr: number[] = [1, 2, 3];
let strArr: string[] = ['hello', 'im', 'winterlood'];
let boolArr: Array<boolean> = [true, false, true];
// 배열에 들어가는 요소들의 타입이 다양할 경우
let multiArr: (number | string)[] = [1, 'hello'];
// 다차원 배열의 타입을 정의하는 방법
let doubleArr: number[][] = [
[1, 2, 3],
[4, 5]
];
길이와 타입이 고정된 배열
별도로 존재하는 자료형이라 보기는 어렵고 사실은 그냥 배열임
따라서, 배열의 메서드를 사용할 수 있음 but, 배열 메서드를 사용할 경우 튜플의 길이 제한이 발동하지 않음 -> 따라서 튜플을 사용해서 배열 메서드를 사용할때는 주의해야함!!!!!!
e.g) push(), pop()
튜플을 언제 사용할때 유용할까?
인덱스별로 다른값을 넣어야할때 그 인덱스의 순서와 위치가 헷갈릴 때 사용하면 유용
// 튜플
// 길이와 타입이 고정된 배열
let tup1: [number, number] = [1, 2];
// tup1 = [1, 2, 3]; 오류
// tup1 = ['1', '2']; 오류
let tup2:[number, string, boolean] = [1, '2', true];
// tup2 = ['2', 1, true]; 오류
// tup2 = [1]; 오류
tup1.push(1);
tup1.pop();
tup1.pop();
tup1.pop();
const users: [string, number][] = [
['이정환', 1],
['이아무개', 2],
['김아무개', 3],
['박아무개', 4],
[5, '최아무개'], // 오류
];
타입스크립트에서 객체의 타입을 지정할때 :object만 써주면 프로퍼티를 알 수 없다고 함
객체 리터럴 타입을 쓰고, 프로퍼티의 타입까지 모두 정의해줘야함
객체의 구조를 기준으로 타입을 정의 : 타입스크립트의 특징 -> 구조적 타입 시스템 (프로퍼티를 기준으로 타입을 결정하는 시스템. Property Based System)
선택적인 프로퍼티를 작성하기 위해서는 ?: 사용
프로퍼티 수정을 하지 못하도록 막고 싶다면 readonly 사용 (읽기 전용 프로퍼티)
e.g) apiKey
// 객체
let user: {
id?: number;
name: string;
} = {
id: 1,
name: '이정환,
}
user.id;
let dog: {
name: string;
color: string;
} = {
name: '돌돌이',
color: 'brown'
}
let config: {
readonly apiKey: string;
} = {
apiKey: 'MY API KEY'
}
config.apiKey = 'hacked'; // 오류
위에서 본 객체를 리터럴 타입을 사용해서 여러 개의 객체를 타입 정의한다면 일일이 하나씩 추가해줘야하므로 귀찮음
타입 별칭을 선언할때, 같은 스코프 내에서 중복되지 않게 해야함
타입 별칭으로 만든 타입도 자바스크립트 코드로 변환하면 없어짐
// 타입 별칭
type User = {
id: number;
name: string;
nickname: string;
birth: string;
bio: string;
location: string;
};
function func() {
type User = {
id: number;
name: string;
nickname: string;
birth: string;
bio: string;
location: string;
};
}
let user: User = {
id: 1,
name: '이정환',
nickname: 'winterlood',
birth: '1997.01.07',
bio: '안녕하세요',
location: '부천시',
};
let user2: User = {
id: 2,
name: '홍길동',
nickname: 'gildong',
birth: '1997.01.18',
bio: '안녕하세요',
location: '광명시',
};
key와 value의 규칙을 기준으로 객체의 타입을 정의할 수 있는 문법
countryNumberCodes의 값이 빈 객체가 될 수 있음 (오류 발생하지 않음)
// 인덱스 시그니처
type CountryCodes = {
[key: string] : string;
};
let countryCodes: CountryCodes = {
Korea: 'ko',
UnitedState: 'us',
UnitedKingdom: 'uk',
};
type CountryNumberCodes = {
[key: string] : number;
Korea: number;
}
let countryNumberCodes = {
Korea: 410,
UnitedState: 840,
UnitedKingdom: 826,
}
여러가지 값들에 각각 이름을 부여해 열거해두고 사용하는 타입
타입스크립트에서만 제공되는 타입임
role을 숫자로 적어서 사용하면 어떤 숫자가 무엇을 의미하는지 까먹을수 있음 -> 이럴때 유용하게 사용할 수 있음
숫자로 역할같은 값들을 분류할때 프로그래머들이 헷갈리지 않게 도움이 될 수 있음
숫자를 적지 않아도 자동으로 인덱스가 지정됨
각각의 멤버의 값이 숫자가 할당 되는 enum: 숫자형 enum 이라고 함
컴파일 되면 타입은 사라진다고 했는데, enum 타입을 값처럼 사용하고 있는데 괜찮을까?
enum 타입은 자바스크립트 코드로 컴파일 되면 사라지지 않고, 객체로 변환됨
const user1 = {
name: '이정환',
role: 0, // 0 <- 관리자
};
const user2 = {
name: '홍길동',
role: 1, // 1 <- 일반 유저
};
const user3 = {
name: '아무개',
role: 2, // 2 <- 게스트
};
enum Role {
ADMIN,
USER,
GUEST,
}
enum Language {
Korean = 'ko',
English = 'en',
}
const user1 = {
name: '이정환',
role: Role.ADMIN,
language: Language.Korean,
};
const user2 = {
name: '홍길동',
role: Role.USER,
language: Language.English,
};
const user3 = {
name: '아무개',
role: Role.GUEST,
language: Language.Korean,
};