1. Structural vs. Nominal Type System
- Structural Type System: 구조가 같으면 같은 타입 -> TypeScript
- Nominal Type System: 구조가 같아도 이름이 다르면 다른 타입 -> C, Java
+) duck typing: 만약 어떤 새가 오리처럼 걷고 헤엄치고 꽥꽥 소리내면 나는 걔를 오리라고 부를거야 -> Python
2. 타입 호환성(Type Compatibility)
- 슈퍼타입에 서브타입 할당 가능 but 서브타입에 슈퍼타입 할당 불가능
ex)
| sub | super |
|---|
| 1 | number |
| number[] | object |
| [number,number] | number[] |
| never | number |
- 예외: number와 any는 양쪽 가능
- 공변: 같거나 서브타입인 경우 할당 가능
반병: 함수의 매개변수 타입만 같거나 슈퍼타입인경우 할당 가능
strictFunctionTypes옵션: 함수 할당 시 매개변수 타입이 같거나 슈퍼타입인 경우가 아니면 에러로 경고
3. 타입 별칭(Type Alias)
- Interface와 비슷
-> 타입의 목적이나 존재가치가 명확하면 interface / 그냥 지칭 또는 별명의 의미이면 alias 사용
- Primitive, Union Type, Tuple, Function을 다른 이름으로 지정
type MyStringType = string;
let myStr: MystringType = "hello";
type StringOrNumber = string | number;
type PersonTuple = [string, number];
type EatType = (food: string) => void;
+) 추가로 학습한 옵션
noImplicitAny옵션: 타입을 명시적으로 지정하지 않은 경우 타입스크립트가 추론 중 any라고 판단하게 되면 컴파일 에러 발생시켜 명시적 지정을 유도 -> any 쓸거면 제대로 적어!
strictNullChecks옵션: 모든 타입에 자동으로 포함되어 있는 null과 undefined 제거
noImplicitReturns옵션: 함수 내에서 모든 코드가 값을 리턴하지 않으면 컴파일 에러 발생
+) object가 매개변수인 경우
function func(a: {name: string; age: number}): string { ..