
typeof
function something(x:number | string) {
if(typeof x === 'string') { //이조건문에서는x === 'string'라고 확신함.
console.log(x.substr(1)); // Ok
console.log(x.subtr(1)); //Error
}
x.subStr(1); //Error : x가 string이라는 보장 없음.
}
instanceof
class Person{
name: string;
age:number;
}
class Animal {
type: string;
}
function Fnc (value:Person|Anumal) {
if(value instanceof Person) {
console.log(value.name)//Okay
console.log(value.type) //Error
} else {
console.log(value.tyype)//Okay
}
}
in
interface A {
x: number;
}
interface B {
y: string;
}
function testFunc(value: A | B) {
if ('x' in value){
// value : A
}else{
// value : B
}
}
interface Car {
brand:string;
year:number;
}
function CarFunc(obj:any): obj is Car {
return 'brand' in obj && 'year' in obj;
}
const myCar = {brand:'Volvo', year:2024}
if(CarFunc(myCar)) {console.log(myCar.brand)}
class Person {
name: string;
age: number;
}
//함수의 return값에 `is` 연산자를 명시해주면 타입을 확정할 수 있는 헬퍼 함수의 역할을 한다고 한다.
function isPerson(obj: any): obj is Person {
return obj instanceof Person;
}
function isNumber(value: any): value is number {
return typeof value === 'number';
}
const num = 42;
if (isNumber(num)) {
console.log(num.toFixed(2));
}
//예시 : 사용자가 이메일을 통해 로그인 하는지 전화번호를 통해 로그인 하는지 분기할 수 있게끔..
//이런식으로 만드는게 맞는지 잘 모르겠음
interface checkUser{
email:string;
password:string;
}
interface checkPhone{
phone:number;
}
function isCheckUser(obj: any): obj is CheckUser {
return (obj && typeof obj.email === 'string' && typeof obj.password === 'string');
}
function login(user: checkUser | checkPhone ) {
if(isCheckUser(user)) {
console.log(user.email, "너는이메일로 로그인했단다")
} else {
console.log(usser.phone, "너는 폰넘으로 로그인했단다")
}
}
// 테스트
const user1: CheckUser = { email: "wendy0708@naver.com",password: "qwer1234" };
const user2: CheckPhone = { phone: 123456789 };