Notice
Recent Posts
Recent Comments
Link
솔미는 성장중
[TS] 타입 호환 본문
728x90
💻 타입 호환
서로 다른 타입이 2개 있을 때 특정 타입이 다른 타입에 포함되는지를 의미
💻 구조적 타이핑
Animals 클래스가 Dog 인터페이스를 상속받아 구현하지 않았는데도 에러가 발생하지 않는 이유는?
interface Dog {
name:string;
}
interface Animals {
name:string;
}
let i: Dog;
i=new Animals();
구조적 타이핑 특성 때문이다!!
🌞 구조적 타이핑 이란?
타입 유형보다는 타입 구조로 호환 여부를 판별하는 언어적 특성
ex) 타입별칭과 인터페이스도 같은 타입 구조를 갖고 있다면 호환 가능
( 속성 이름까지 일치해야 함 )
💻 호환 가능 여부따지기
1. 객체 타입의 호환
- 타입 유형에 관계없이 동일한 이름의 속성을 갖고 있고 해당 속성의 타입이 같으면 호환 가능
- 두 타입 간 동일한 타입을 가진 속성이 1개라도 있다면 호환 가능
ex)
type Person = {
name: string;
}
interface Developer = {
name: string;
skill: string;
}
let A: Person = {
name: '에이'
}
let B: Developer = {
name: '삐',
skill: '개발'
}
A = B //ok
B = A //error. A는 skill속성이 없어서. (해결하려면 skill 속성 추가 or 옵셔널로 변경)
(속성 개수가 더 적은 객체에 속성 개수가 더 많은 객체를 할당 가능
= 속성 개수가 더 많은 쪽이 속성 개수가 더 적은 쪽으로 호환됨)
2. 함수 타입의 호환
함수의 타입 호환 기준 = 기존 함수 코드의 동작을 보장해줄 수 있는가?
파라미터가 더 많이 정의된 함수에 파라미터가 더 적은 함수를 할당 가능
(반대의 경우는 빈 곳에 undefined 값이 들어가버림)
3. 이넘 타입의 호환
- 숫자형 이넘은 숫자와 호환됨
- 이넘 타입은 같은 속성과 값을 가졌더라도 이넘 타입 간에는 서로 호환 X
4. 제네릭 타입의 호환
- 제네릭으로 받은 타입이 해당 타입 구조에서 사용되었는지에 따라
ex) 제네릭으로 받은 타입이 해당 타입 구조에서 사용되지 않는다면 타입 호환에 영향 X
interface Empty<T>{}
let empty1: Empty<string>='';
let empty2: Empty<number>=0;
empty2 = empty1; //ok
empty1 = empty2; //ok
ex) 제네릭으로 받은 타입을 타입 구조 안에서 사용한 경우
interface NotEmpty<T>{ data: T; }
let notEmpty1: NotEmpty<string>;
let notEmpty2: NotEmpty<number>;
notEmpty2 = notEmpty1; //error
notEmpty1 = notEmpty2; //error
728x90
'TypeScript' 카테고리의 다른 글
[TS] 함수 오버로딩 (overloading) / 접근 제어자(public, protected, private) (0) | 2023.10.02 |
---|---|
[TS] 타입 가드 (0) | 2023.08.30 |
[TS] 타입 단언 (0) | 2023.08.30 |
[TS 2주차] 제네릭이란 무엇인가! (+ 제네릭을 제한하려면..?) (0) | 2023.08.23 |
[TS 2주차] 타입 별칭 vs 인터페이스 : 차이점은 무엇이고, 무엇을 써야하는가! (0) | 2023.08.22 |