타입 별칭을 이용하면 다음과 같이 변수를 선언하듯 타입을 별도로 정의할 수 있다.
type User = {
id: number;
name: string;
nickname: string;
mbti: string;
};
let user1: User = {
id: 1,
name: "woodstock",
nickname: "woody",
mbti: "ESTJ",
};
let user2: User = {
id: 1,
name: "coco",
nickname: "wawa",
mbti: "INFJ",
};
참고로 동일한 스코프에 동일한 이름의 타입 별칭을 선언하는 것을 불가능 하다.
그러나 스코프가 다르다면 아래와 같이 중복된 이름으로 여러개의 별칭을 선언해도 상관없다.
인덱스 시그니처는 객체 타입을 유연하게 정의할 수 있도록 돕는 특수한 문법이다.
type CountryCodes = {
[key: string]: string;
};
let countryCodes: CountryCodes = {
Korea: "ko",
UnitedState: "us",
UnitedKingdom: "uk",
};
인덱스 시그니처는 규칙을 위반하지만 않으면 모든 객체를 허용하기 때문에 아래와 같이 빈 객체에서도 오류를 발생시키지는 않는다.
type CountryNumberCodes = {
[key: string]: number;
};
let countryNumberCodes: CountryNumberCodes = {};
또한, 반드시 포함해야 하는 프로퍼티가 있다면 다음과 같이 직접 명시해도 된다.
type CountryNumberCodes = {
[key: string]: number;
Korea: number; // 필수 프로퍼티
};
한 가지 주의할 점은,
인덱스 시그니처를 사용하면서 동시에 추가적인 프로퍼티를 또 정의할 떄에는 인덱스 시그니처의 value
타입과 직접 추가한 프로퍼티의 value
타입이 호환되거나 일치해야 한다.
따라서, 다음과 같이 서로 호환되지 않는 타입으로 설정하면 오류가 발생한다.
type CountryNumberCodes = {
[key: string]: number;
Korea: string; // 에러
};
let countryNumberCodes: CountryNumberCodes = {
Korea: "kr", // 에러
};