2014-10-03 8 views
7

우리는, 우리의 클래스 중 하나의 전형적인 게터가이 작업을TypeScript Setter가없는 속성의 인터페이스 서명입니다.

class Employee implements IEmployee { 
    private _fullName: string; 

    get fullName(): string { 
     return this._fullName; 
    } 
} 

및 인터페이스를 말할 수이 인터페이스를 통해 인스턴스와 작업 할 때

interface IEmployee{ 
    fullName: string; 
} 

컴파일러는 우리에게 경고하지 않습니다 우리가 fullName에 할당하려고하면 setter가 없다는 것에 대해 JS 런타임은 할당을 삼켜 버리고 오류를 던지지 않습니다. 인터페이스 멤버를 getter 또는 setter 만 갖는 것으로 표시 할 수있는 방법이 있습니까?

나는 this post을 보았지만, 상당히 개선되었습니다. 알고 싶습니다.

+0

정말이 질문에 대한 활동 부족에 놀랐습니다. 읽기 전용 속성은 매우 유용하며 TypeScript에서 구현하려고했던 첫 번째 패턴 중 하나입니다. – gravidThoughts

답변

1

이것은 흥미로운 질문입니다. 읽기 전용 속성의 개념은 TypeScript에서 다른 언어와 약간 다릅니다.

많은 언어에서 속성을 설정하려고 시도했지만 형식 스크립트가없는 경우 getter가있는 속성 (설정자가 없음)은 컴파일러 오류를 발생시킵니다.

속성을 설정하려고해도 아무런 차이가 없으므로 읽기 전용입니다. 세트가 자동으로 실패합니다. 내가 x.name = 'Example 2';를 사용할 때

class Example { 
    get name() { 
     return 'Steve'; 
    } 
} 

var y = new Example(); 
y.name = 'Example 2'; 
alert(y.name); 

더 컴파일러 경고가 없습니다 : 여기

는 인터페이스없이 예입니다.

이 컴파일러 경고 인 경우이면 인터페이스 내에 속성의 읽기 전용을 지정하는 방법이있을 것으로 기대됩니다. 위의 정보를 감안할 때 인터페이스에서 읽기 전용 속성을 설정할 수는 없습니다.

interface Test { 
    name: string; 
} 

class Example { 
    get name() { 
     return 'Steve'; 
    } 
} 

var x: Test = new Example(); 
x.name = 'Example 1'; 
alert(x.name); 

var y = new Example(); 
x.name = 'Example 2'; 
alert(x.name); 

이 경우에만 (가 설정할 수 있습니다 분명히 어떤 방법) 속성의 값을 얻을 수있는 방법을함으로써 읽기 전용 - 다움을 적용 할 수 있음을 의미합니다.

interface Test { 
    getName:() => string; 
} 

class Example { 
    getName() { 
     return 'Steve'; 
    } 
} 

var x: Test = new Example(); 
//x.getName('Obviously not'); 
//x.getName() = 'Obviously not'; 
alert(x.getName()); 

var y = new Example(); 
//y.getName('Obviously not'); 
//y.getName() = 'Obviously not'; 
alert(y.getName()); 
+0

Readonlyness는 설정자가 없을 때 JS 동작에 의해 이미 많이 적용됩니다. 문제는 조용히 그 가치를 삼키는 침묵의 본성입니다. 이상적인 (그리고 잘만되면) 솔루션은 TS 인터페이스 구성원이 getter \ setter 만 갖는 것으로 표시되도록 허용합니다. 대안은 transpiler가 빈 getter setter를 생성하는 것입니다.이 경우 단순히 오류가 발생합니다 (적어도 setter에게는 이것이 전체 팀이 예상 한 동작 임). 마지막 지루한 해결책은 실제 세터가 필요하지 않은 경우 항상 손으로 던지는 세터를 만드는 것입니다. –

+0

'Readonlyness는 설정자가 없을 때 JS 동작에 의해 이미 많이 시행됩니다. '예 - 컴파일 된 경고, 불규칙한 빨간색 선 및 일종의 가청 경보에 대해 더 자세히 이야기했습니다. 예제 코드는 설정된 시도에 대한 자동 폐기를 보여줍니다. 그 동안, 속성 접근을위한 메소드를 사용하는 것은 설정 시도를 시도하지 않고 컴파일 시간을 보장하는 유일한 방법입니다. – Fenton

+0

이 문제에 대해 GitHub에서 문제가 발생했습니다. https://github.com/Microsoft/TypeScript/issues/814 –