유형 스크립트: 두 가지 서로 다른 유형의 시스템 이름 유형과 구조 부분 유형
3738 단어 TypeScript
유형별 호환성은 무엇입니까?
우선 모델의 호환성은 무엇입니까?TypeScript에서 다른 유형을 어떤 유형에 대입할 수 있는지 여부는 호환성의 판단 기준입니다.예를 들어,
1
는 number
를 대입할 수 있으므로 1
호환 number
입니다.한편, true
대입할 수 없기 때문에 number
과 true
는 호환되지 않는다.두 가지 유형의 시스템
TypeScript의 호환성 판단 기준(즉, 대입 가능한 기준)은 Java와 PHP 등과 다릅니다.어떻게 다른지 봅시다.
표시 - 상속 관계에 초점을 맞춘 Java
자바와 PHP는 공칭형(nominal typing)의 형 시스템을 채택했다.표시 형식에서 형식의 호환성은 대상 간의 계승 관계 (is-a 관계) 에 달려 있다.
예를 들어
number
과Animal
이 두 종류가 완전히 같은User
속성을 가지고 같은 방식으로 처리할 수 있지만 계승 관계가 없으면 name
실례를 User
유형의 변수에 대입할 수 없고 반대로도 마찬가지다.호환되지 않습니다.반대로 Animal
류계승Cat
이면 Animal
형 변수를 대입할 수 있다.Animal
은(는) Cat
과 호환됩니다.Cat
및 Animal
에 동일한 속성과 방법이 있는 경우 객체의 "능력"은 동일합니다.따라서 사용Animal
에서User
해도 좋다.설령 그것이 규격상의 오류라고 해도 논리적 오류가 되지는 않을 것이다.하지만 이렇게 교환할 수 없는 것은 공칭형이다.상속 관계가 있느냐 없느냐가 중요하다.'능력'보다'혈통'을 중시하는 형 시스템.
구조 부분 유형 - 구조에 착안한 유형 스크립트
TypeScript는 구조적 부분형이라는 시스템을 사용합니다.구조 부분 유형은 대상의 속성이 호환되는지, 즉 구조가 상속 관계가 아니라 같은지에 착안한다.
예를 들어 두 클래스
User
와 Animal
가 상속 관계가 없지만 같은 Animal
속성을 가지고 있다면 User
유형의 변수에 name
값을 부여할 수 있다.반대로도 마찬가지다.서로 호환성이 있다는 얘기다.class Animal {
public name: string = ''
}
class User {
public name: string = ''
}
let user: User = new User()
let animal: Animal = new Animal()
user = animal // OK
animal = user // OK
User
및 Animal
인터페이스가 같은 경우 객체의 "능력"은 동일합니다.계승 관계가 없어도 능력이 같은지도 중요하다.'혈통'보다'능력'을 중시하는 것은 구조적인 부분형이라고 할 수 있다.본문에서 인터페이스가 같다면 TypeScript는 호환됩니다.하지만 정확하지는 않다.같은 인터페이스를 가진 클래스 간에도 호환되지 않을 수 있습니다. 즉, 대입할 수 없습니다.그것에 관해서 나는 아래의 투고에서 설명하고 싶다.
끝까지 읽어주셔서 감사합니다.트위터에는 Qiita에 기술소재 등을 쓰지 않는 트윗도 있으니 가능하면 팔로우하세요→Twitter@suin
Reference
이 문제에 관하여(유형 스크립트: 두 가지 서로 다른 유형의 시스템 이름 유형과 구조 부분 유형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/suin/items/52cf80021361168f6b0e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)