타입을 좁혀가기 위한 과정이다.
any와 같은 넓은 범위의 타입을 좁히고 그로 인해 타입스크립트를 더욱 안정적으로 사용할 수 있다.
// string만 반환해야 하는데 number 반환도 있어서 에러 ↓
function print(value: number | string):string {
if(typeof value === 'number') {
return value;
}
if(typeof value === 'string') {
return value;
}
return value;
}
boolean
반환속성 in 객체명
interface Dog {
name: string
bark(): '멍멍'
}
interface Cat {
name: string
meow(): '냐옹'
}
function sayAnimal(animal: Dog | Cat) {
if('bark' in animal) {
animal.bark()
}
if('meow' in animal) {
animal.meow()
}
}
boolean
반환function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car); // true
console.log(auto instanceof Object); // true
function getDate(date: Date | string):Date {
if(date instanceof Date) { // Date 객체의 인스턴스일 경우 date 반환
return date
}
return new Date(date) // 아닐 경우 new Date로 바꿔서 반환
}
매개변수 is 타입
// 검사하는 함수명 앞에 is라는 prefix를 붙임
function isDate(date: Date | string):date is Date {
return date instanceof Date
}
function getDate(date: Date | string):Date {
if(isDate(date)) {
return date
}
return new Date(date)
}
interface Dog {
name: string
bark(): '멍멍'
}
interface Cat {
name: string
meow(): '냐옹'
}
function isDog(animal: Dog | Cat): animal is Dog {
return 'bark' in animal
}
function isCat(animal: Dog | Cat): animal is Cat {
return 'meow' in animal
}
function sayAnimal(animal: Dog | Cat) {
if( isDog(animal) ) {
animal.bark()
}
if( isCat(animal) ) {
animal.meow()
}
}