타입 별칭(alias)과 선택적 프로퍼티(optional properties)
타입 별칭 (Type Alias)
타입 별칭은 특정 타입에 이름을 붙여 코드에서 반복해서 사용할 수 있게 해주는 기능이다.. 이는 코드의 가독성을 높이고, 타입을 재사용할 수 있도록 도와준다. 타입 별칭은 기본 타입뿐만 아니라 복잡한 객체 타입에도 사용할 수 있다.
선택적 프로퍼티 (Optional Properties)
선택적 프로퍼티는 객체의 특정 프로퍼티가 필수적이지 않고 선택적으로 포함될 수 있음을 나타낸다. 선택적 프로퍼티는 타입 정의에서 프로퍼티 이름 뒤에 물음표(?)를 붙여 표시하여 사용할 수 있다.
Flutter에서 Modal 클래스와 Nullable 객체 처리하였던 기억이 났다 :)
type Age = number; // 'Age'는 숫자 타입으로 정의된 타입 별칭(alias)
type Name = '정규' | '정언'; // 'Name'에 대해서 특정 text를 적용
type Player = { // 'Player' 타입은 객체 타입으로 정의된 타입 별칭을 말한다.
name: Name; // 'name' 프로퍼티는 'Name' 타입, 즉 문자열 타입을 말한다.
age?: Age; // 'age' 프로퍼티는 선택적(optional)이며, 'Age' 타입, 즉 숫자 타입이다.
}
const jk: Player = { // 'jk'는 'Player' 타입으로 선언된 상수이다.
name: "정규" // 'name' 프로퍼티만 설정되어있다.
}
const je: Player = { // 'je'도 'Player' 타입으로 선언된 상수이다.
name: "정언",
age: 12
}
// 'playerMaker' 함수는 문자열 타입의 인자를 받고 'Player' 타입의 객체를 반환한다.
function playerMaker(name: string): Player {
return {
name // 객체의 'name' 프로퍼티에 인자로 받은 'name'을 설정하여 반환한다.
}
}
const jk2 = playerMaker("Benjie"); // 'jk2'는 'playerMaker' 함수를 호출하여 생성된 'Player' 타입의 객체입니다.
jk2.age = 12; // 'jk2' 객체의 선택적 프로퍼티 'age'에 값을 설정합니다.
// 이때 만약 playerMaker에 대해서 Player의 타입으로 객체를 변환하지 않는다면 'jk2.age'에 대해서 컴파일 에러가 뜬다.
readonly
readonly을 통해 아래 코드 사진과 같이 객체의 프로퍼티를 읽기 전용으로 만들어 수정할 수 없도록 설정하여 데이터의 무결성을 유지하고, 의도하지 않은 수정으로부터 객체를 보호할 수 있다.
Tuple
Tuple은 고정된 개수의 요소를 가지며, 각 요소의 타입이 미리 정의된 배열을 말한다. 튜플을 사용하면 배열의 요소 타입과 개수를 엄격히 지정할 수 있어, 데이터 구조를 더 명확하게 표현할 수 있다. 또한 readonly를 통해 읽기 전용으로 설정할 수 있다.
any & unknown
any
any 타입은 모든 타입의 값을 허용하는 특수 타입을 말한다. any 타입을 사용하면 해당 변수에 어떤 종류의 값도 할당할 수 있으며, 타입 검사기가 해당 변수에 대한 타입 검사를 수행하지 않게된다. 이는 TypeScript의 타입 안전성을 무효화 것이기 때문에, 일반적으로는 필요한 경우에만 사용해야 한다.
unknown
unknown 타입은 TypeScript에서 모든 타입을 나타낼 수 있는 타입으로, any와 유사하지만 더 안전하게 사용할 수 있다. unknown 타입의 변수는 타입이 확인되기 전까지는 사용할 수 없기 때문에, 안전한 타입 검사를 요구해야하며, 이는 코드의 타입 안전성을 높여주며, any 타입보다 더 안전한 대안으로 사용될 수 있다.
never
never 타입은 어떤 값도 가질 수 없는 타입을 의미하며 이는 함수가 정상적으로 끝나지 않거나, 절대 반환되지 않는 상황을 나타낼 때 사용된다. 주로 함수가 예외를 던지거나, 무한 루프에 빠지는 경우에 사용됩니다.
function hello(name: string | number) {
if (typeof name === "string") {
name; // name은 여기서 string 타입
} else if (typeof name === "number") {
name; // name은 여기서 number 타입
} else {
name; // 여기서 name은 never 타입
}
}