컴파일러에게 사용하는 타입을 명시저긍로 지정하는 시스템
컴파일러가 자동으로 타입을 추론하는 시스템
타입을 명시적으로 지정할 수 있다.
그렇지 않으면, 타입스크립트 컴파일러가 자동으로 타입을 추론한다.
타입을 명시적으로 지정하지 않은 경우, 타입스크립트가 추론 중 'any'라고 판단하게 되면 컴파일 에러를 발생시켜 명시적으로 지정하도록 유도한다.
모든 타입에 자동으로 포함되어 있는 'null'과 'undefined'를 제거한다.
함수 내에 모든 코드가 값을 리턴하지 않으면, 컴파일 에러를 발생시킨다.
모든 코드에서 리턴을 직접 해야한다.
구조가 같으면 같은 타입이다.
구조가 같아도 이름이 다르면 다른 타입이다.
어떤 새가 오리처럼 걷고 소리를 내면 나는 그 새를 오리라고 부를 것이다.
(python)
let sub1: 1 = 1;
let sup1: number = sub1;
//sub1 타입은 sup1 타입의 서브 타입이다.
sub1 = sup1; //안됨
let sub2: number[] = [1];
let sup2: object = sub2;
//sub2 타입은 sup2 타입의 서브 타입이다.
let sub3: [number, number] = [1,2];
let sup3: number[] = sub3;
//sub3 타입은 sup3 타입의 서브 타입이다.
let sub4: number = 1;
let sup4: any = sub4;
//sub4 타입은 sup4 타입의 서브 타입이다.
sub4 = sup4; //에러는 안남
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; //에러
같거나 서브 타입인 경우, 할당이 가능하다. (공변)
함수의 매개변수 타입만 같거나 슈퍼타입인 경우, 할당이 가능하다. (반병)
primitive, union, type, function을 다른 이름으로 짓거나,
기타 직접 작성해야하는 타입을 다른 이름으로 지정할 수 있다.
만들어진 타입의 refer로 사용하는 거고 타입을 만드는 것은 아니다.
//프리미티브 타입
type MyStringType = string;
//유니온 타입
type StringOrNumber = string | number;
let another: StringOrNumber 0;
//튜플 타입
type PersonTupe = [string, number];
let another: PersonTuple = ['a', 22];
//함수
type EatType (food: string) => void;
* interface와는 다르니 잘 구분해서 쓸 것.