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
- 답변 # 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
관련 자료
- 사전이있는 typescript 클래스 객체를 JSON 문자열로 변환
- javascript - typescript 클래스 데코레이터 - 생성자를 재정의하지만 클래스 이름은 유지 하시겠습니까?
- javascript - TypeScript 동적 또는 프로그래밍 방식으로 함수 연결
- java - 상속 (확장)을 통해 개인 인스턴스 변수를 다른 클래스로 가져 오려면 어떻게해야합니까?
- typescript에서 generic으로 클래스를 확장하는 방법은 무엇입니까?
- 이 키워드를 자바 스크립트 클래스 함수에 전달하는 방법
- javascript - 타이프 스크립트의 연결 함수
- c++ - 클래스 멤버로서의 템플릿 인수 함수
- 추상 클래스를 Generic 제약 조건으로 전달하고 구성하는 Typescript
- c++ - 클래스 외부에서 개인 멤버 함수를 정의하는 방법은 무엇입니까?
- TypeScript에서 다른 파일에있는 클래스를 사용하는 방법
- TypeScript 클래스가 일반 컴파일 오류를 발생시키는 이유는 무엇입니까?
- angular - 타자기 - 여기서 클래스 인스턴스는 어떻게 생성됩니까?
- php - 클래스에없는 함수에 대해 phpunit 테스트를 사용할 수 있습니까?
- c++ - 개인 구성원이 증가함에 따라 클래스 개체의 크기가 커 집니까?
- 더 나은 접근 방식 클래스 또는 인터페이스
- vue.js - Typescript 및 클래스 구성 요소 데코레이터를 사용할 때 Vue Router에서 소품을 전달하는 방법
- c++ - 클래스 개체가 자신의 개인 멤버에 액세스 할 수 없습니까?
- inheritance - C ++ | 파생 클래스는 자체 개인 멤버가 아닌 기본 클래스의 개인 멤버에 액세스합니다
- typescript - 속성이있는 함수
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- JavaScript 변수를 HTML div에 '출력'하는 방법
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 문자열에서 특정 문자 제거
Microsoft/TypeScript # 18499 문제는 호환성을 결정할 때 개인 구성원이 필요한 이유를 설명합니다. @RyanCavanaugh의 한 가지 언급은 특히 관련성이 있으며 다음과 같습니다.
와이즈 비즈 와이즈 비즈와이즈 비즈
확실히 말하면, 여기서 실패 할 것입니다 :
따라서 할 수없는 데는 충분한 이유가 있습니다.
<시간>해결책으로 다음과 같이 매핑 된 유형의 클래스의 공용 속성 만 가져올 수 있습니다.
그리고 당신은
sameAs
를 가질 수 있습니다const identity = new Identity(); const mockIdentity = new MockIdentity(); identity.sameAs(mockIdentity); // boom!
가 아닌 구현 그러나type PublicPart<T> = {[K in keyof T]: T[K]}
:도움이되는 희망;행운을 빕니다!