May 24, 2021
function func1(a: number, b: number | string) {
const v1: number | string = a;
const v2: number = b; // v2에서 컴파일 에러
}
function func2(a: 1 | 2) {
const v1: 1 | 3 = a; // v1에서 컴파일 에러
const v2: 1 | 2 | 3 = a;
}
func1
에서 v2
의 타입은 number
이고, b
의 타입은 number
또는 string
이다. 이 때, b
는 string
일수도 있는데 number
타입인 v2
에 할당하려고 하니 에러가 발생하는 것이다.func2
의 a
가 2
일 수 있는데, 1
또는 3
타입을 가진 v1
에 할당하려고 하니 에러가 발생한다.interface Person {
name: string;
age: number;
}
interface Animal {
name: string;
age: number;
}
const p1: Person = { name: 'jessie', age: 23 };
const a1: Animal = p1;
Person
과 Animal
는 서로 타입 이름이 다르지만 내부 구조는 같기 때문에 Person
과 Animal
는 서로 할당이 가능하다.Person
인터페이스의 age: number;
부분을 지운다면, Person
의 집합이 Animal
의 집합보다 크기 때문에 p1 = a1
은 가능하고 a1 = p1
는 불가능하다.type F1 = (a: number, b: string) => string;
type F2 = (a: number, b: number | string) => string;
type F3 = (a: number) => string;
type F4 = (a: number) => number | string;
let f1: F1 = (a, b) => `${a} ${b.length}`;
let f2: F2 = (a, b) => `${a} ${b}`;
let f3: F3 = a => `${a}`;
let f4: F4 = a => (a < 10 ? a : 'big');
f1 = f3;
f3 = f1; // f3에서 컴파일 에러
f1 = f2;
f2 = f1; // f2에서 컴파일 에러
f4 = f3;
f3 = f4; // f3에서 컴파일 에러
함수 타입 B가 함수 타입 A로 할당 가능하기 위한 조건 (A = B)