유형 스크립트: 두 가지 서로 다른 유형의 시스템 이름 유형과 구조 부분 유형

3738 단어 TypeScript
본고는 두 가지 서로 다른 유형 시스템의'표칭 유형'과'구조 부분 유형'사이의 차이를 소개했다.

유형별 호환성은 무엇입니까?


우선 모델의 호환성은 무엇입니까?TypeScript에서 다른 유형을 어떤 유형에 대입할 수 있는지 여부는 호환성의 판단 기준입니다.예를 들어, 1number 를 대입할 수 있으므로 1 호환 number 입니다.한편, true 대입할 수 없기 때문에 numbertrue 는 호환되지 않는다.

두 가지 유형의 시스템


TypeScript의 호환성 판단 기준(즉, 대입 가능한 기준)은 Java와 PHP 등과 다릅니다.어떻게 다른지 봅시다.

표시 - 상속 관계에 초점을 맞춘 Java


자바와 PHP는 공칭형(nominal typing)의 형 시스템을 채택했다.표시 형식에서 형식의 호환성은 대상 간의 계승 관계 (is-a 관계) 에 달려 있다.
예를 들어 numberAnimal 이 두 종류가 완전히 같은User 속성을 가지고 같은 방식으로 처리할 수 있지만 계승 관계가 없으면 name 실례를 User 유형의 변수에 대입할 수 없고 반대로도 마찬가지다.호환되지 않습니다.반대로 Animal류계승Cat이면 Animal형 변수를 대입할 수 있다.Animal은(는) Cat과 호환됩니다.
CatAnimal 에 동일한 속성과 방법이 있는 경우 객체의 "능력"은 동일합니다.따라서 사용Animal에서User해도 좋다.설령 그것이 규격상의 오류라고 해도 논리적 오류가 되지는 않을 것이다.
하지만 이렇게 교환할 수 없는 것은 공칭형이다.상속 관계가 있느냐 없느냐가 중요하다.'능력'보다'혈통'을 중시하는 형 시스템.

구조 부분 유형 - 구조에 착안한 유형 스크립트


TypeScript는 구조적 부분형이라는 시스템을 사용합니다.구조 부분 유형은 대상의 속성이 호환되는지, 즉 구조가 상속 관계가 아니라 같은지에 착안한다.
예를 들어 두 클래스UserAnimal가 상속 관계가 없지만 같은 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
UserAnimal 인터페이스가 같은 경우 객체의 "능력"은 동일합니다.계승 관계가 없어도 능력이 같은지도 중요하다.'혈통'보다'능력'을 중시하는 것은 구조적인 부분형이라고 할 수 있다.

본문에서 인터페이스가 같다면 TypeScript는 호환됩니다.하지만 정확하지는 않다.같은 인터페이스를 가진 클래스 간에도 호환되지 않을 수 있습니다. 즉, 대입할 수 없습니다.그것에 관해서 나는 아래의 투고에서 설명하고 싶다.
끝까지 읽어주셔서 감사합니다.트위터에는 Qiita에 기술소재 등을 쓰지 않는 트윗도 있으니 가능하면 팔로우하세요Twitter@suin

좋은 웹페이지 즐겨찾기