interface Iperson {
name: string;
age: number;
speak(): string;
}
type personType = {
name: string;
age: number;
speak(): string
}
두개는 구조가 같기 때문에 대입해서 쓸 수 있다. 그렇기 때문에 구조가 같다면 타입을 일일히 만들지 않아도 될듯!
//sub1 타입은 sup1 타입의 서브 타입이다.
let sub1 : 1 = 1;
let sup1: number = sub1
sub1 = sup1 // 에러다 sup1의 타입이 더 크기 때문이다
let sub2 : number[] = [1];
let sup2 : object = sub2
sub2 = sup2 // 에러다. sub2가 더 작기 때문에.
let sub3 : [number,number] = [1,2];
let sup3 : number[] = sub3;
sub3 = sup3;
let sub4 : number = 1;
let sup4 : any = sub4;
sub4 = sup4; //any라서 다 가능 ㅋㅋ
let sub5 : never = 0 as never ;
let sup5 : number = sub5 ;
sub5 = sup5 //에러다
class Animal {}
class Dog extends Animal {
eat() {}
}
let sub6: Dog = new Dog();
let sup6: Animal = sub6;
sub6 = sup6; //에러다
- 같거나 서브 타입인 경우 할당이 가능하다. => 공변이라고 부른다.
- 함수의 매개변수 타입만 같거나 슈퍼타입인 경우, 할당이 가능하다.
=> 반병이라고 부른다.
type MystringType = string;
const str = 'world';
let mystr: MystringType = 'hello'; //구조가 같으면 같은 타입이다.
mystr = str;
let person : string | number = 0;
person = 'mark'
type stringOrNumber = string | number ;
let another : stringOrNumber = 0;
another = 'Anna"
- 유니온 타입은 a도 가능하고 b도 가능한 타입
- 길게 쓰는걸 짧게 줄이려고 할때 !
let person: [string, number] = ['mark',35] ;
type personTuple = [string, number];
let another : personTuple = ['anna',24];
// 튜플 타입에 별칭을 줘서 여러군데서 사용할 수 있게 한다.
type EatType = (food:string) => void;
알리아스와 인터페이스를 어떻게 구분해서 사용할까??
- 어떤 타입이 그 타입으로서 목적이나 존재가치가 명확하면 인터페이스를 사용한다.
- 그렇지 않고 대상을 가르킬뿐이던가, 별명으로서만 존재한다면 알리아스를 사용하는편이다.