>

TypeScript에서 클래스를 구현하는 클래스가있을 가능성을 탐색하고있었습니다.

따라서 다음 코드를 작성했습니다 : 운동장 링크 :

class A {
    private f() { console.log("f"); }
    public g() { console.log("G"); }
}
class B implements A {
    public g() { console.log("g"); }
}

그리고 오류가 발생했습니다 : Class 'B' incorrectly implements class 'A' --- property 'f' is missing in type 'B'  내가 실제로 extends 를 의미한다는 제안과 함께 .

그래서 f 라는 개인 필드를 만들려고했습니다.  (와이즈 와이즈)  다른 액세스 수정자가 있음을 감지하여 작동하지 않음) 운동장 링크

이제 오류가 발생합니다 : public ;이것은 나를 매우 혼란스럽게합니다 :

  • 개인 구성원이 중요한 이유-다른 데이터 구조를 사용하여 동일한 알고리즘을 구현하는 경우 유형 검사를 위해 동일한 이름의 것을 선언해야합니까?
  • Class 'B' incorrectly implements class 'A'. Types have separate declarations of a private property 'f' 를 구현할 때 왜 오류가 발생합니까?  개인 기능으로?

실제로는이 작업을 수행하지 않겠지 만 TS가 왜 이런 식으로 작동하는지 궁금합니다.

감사합니다!

f

  • 답변 # 1

    Microsoft/TypeScript # 18499 문제는 호환성을 결정할 때 개인 구성원이 필요한 이유를 설명합니다. @RyanCavanaugh의 한 가지 언급은 특히 관련성이 있으며 다음과 같습니다.

    와이즈 비즈 와이즈 비즈
    와이즈 비즈  
    Allowing the private fields to be missing would be an enormous problem, not some trivial soundness issue. Consider this code:

    의 공개 호환 버전입니다  그러나 그것을 class Identity { private id: string = "secret agent"; public sameAs(other: Identity) { return this.id.toLowerCase() === other.id.toLowerCase(); } } class MockIdentity implements Identity { public sameAs(other: Identity) { return false; } } 에서 충돌로 사용하려고하면  비 조롱 사본이 조롱 사본과 상호 작용할 때.

    확실히 말하면, 여기서 실패 할 것입니다 :

    MockIdentity
    
    

    따라서 할 수없는 데는 충분한 이유가 있습니다.

    <시간>

    해결책으로 다음과 같이 매핑 된 유형의 클래스의 공용 속성 만 가져올 수 있습니다.

    Identity
    
    

    그리고 당신은 sameAs 를 가질 수 있습니다   const identity = new Identity(); const mockIdentity = new MockIdentity(); identity.sameAs(mockIdentity); // boom! 가 아닌 구현  그러나 type PublicPart<T> = {[K in keyof T]: T[K]} :

    B
    
    

    도움이되는 희망;행운을 빕니다!

  • 답변 # 2

    이 경우 현재 타입 스크립트 사양으로는 불가능합니다. 이에 대한 추적 된 문제가 있지만 종료되었습니다.

    제안 : 구현 클래스가 구현 클래스의 개인 메소드를 무시하도록 허용합니다.

    <시간>

    TypeScript에서 순수 추상 클래스 확장 및 구현 참조

  • 답변 # 3

    이것은 기본적으로 비공개 멤버의 가시성이 인스턴스가 아닌 유형에 따라 결정되기 때문입니다. T 유형의 모든 개체가 T 유형의 다른 개체의 개인에 액세스 할 수 있음을 의미합니다.

    T의 모든 인스턴스가 T의 구현을 상속하므로 명목상의 유형의 언어에서는 문제가되지 않지만, 타이프 스크립트의 구조적 유형이 있기 때문에 T를 충족하는 모든 인스턴스가 클래스를 구현한다고 가정 할 수는 없습니다. 유형 T를 선언합니다.

    비공개 범위의 멤버는 해당 유형의 공개 계약의 일부 여야 함을 의미합니다. 그렇지 않으면 구조 유형 T의 오브젝트가 동일한 구조 유형을 가진 다른 오브젝트의 존재하지 않는 개인 멤버를 호출 할 수 있습니다.

    개인이 공개 유형 계약의 일부가되도록 강요하는 것은 좋지 않으며 유형이 아닌 인스턴스에 개인을 범위 지정함으로써 피할 수있었습니다.

  • 답변 # 4

    Typescript의 기본 지원은 간단합니다.

    A
    
    

    설명 : PublicPart<A>   class A { private f() { console.log("f"); } public g() { console.log("G"); } } // works class B implements PublicPart<A> { public g() { console.log("g"); } } 의 공용 속성 및 메서드 만 반환 및 class A { private f() { console.log("f"); } public g() { console.log("G"); } } class B implements Pick<A, keyof A> { public g() { console.log("g"); } }  그런 다음 keyof A 를 트림합니다  공개 재산 및 해당 유형에만 적용됩니다.

    A

관련 자료

  • 이전 screen scraping - Python Beautiful Soup, 'data-id'를 검색하는 방법
  • 다음 javascript - 새로 고친 후에 만 ​​작동하는 JS 또는 JQ의 동적으로로드 된 스크립트