2014-10-03 38 views
7

Mamy typowe getter w jednym z naszych klas, powiedzmySygnatura interfejsu TypeScript dla właściwości bez ustawnika.

class Employee implements IEmployee { 
    private _fullName: string; 

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

oraz interfejs do pracy z nim

interface IEmployee{ 
    fullName: string; 
} 

Podczas pracy z instancji za pośrednictwem tego interfejsu kompilator nie będzie nas ostrzec o nieobecności setera, jeśli spróbujemy przypisać do fullName, a środowisko wykonawcze JS po prostu połknie dowolne przypisanie i nie spowoduje błędu. Czy jest jakiś sposób na zaznaczenie członka interfejsu jako posiadającego tylko odbiorcę lub tylko setera?

Widziałem this post, ale jest dość stary, chcę wiedzieć, czy coś się poprawiło.

+0

Naprawdę zaskoczony brakiem aktywności na to pytanie. Właściwości tylko do odczytu są niezwykle użyteczne i są jednym z pierwszych wzorców, które próbowałem zastosować w języku TypeScript. – gravidThoughts

Odpowiedz

1

To interesujące pytanie. Pojęcie właściwości tylko do odczytu jest nieco inne w TypeScript w innych językach.

W wielu językach właściwość z programem pobierającym (ale bez ustawiacza) spowodowałaby błąd kompilatora przy próbie ustawienia właściwości, ale TypeScript tego nie robi.

Właściwość jest nadal tylko do odczytu, ponieważ nie ma znaczenia, jeśli spróbujesz ją ustawić; zestaw nie powiedzie się po cichu.

Oto przykład bez żadnych interfejsów:

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

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

Nie ma ostrzeżenie kompilatora kiedy używam x.name = 'Example 2';.

Jeśli był ostrzeżenie kompilatora, będę następnie oczekiwać, że istnieje sposób określania readonly-ness właściwość w interfejsie. Jak można się jednak spodziewać, biorąc pod uwagę powyższe informacje, nie można ustawić właściwości tylko do odczytu na interfejsie.

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); 

Oznacza to, że można tylko egzekwować readonly-ności poprzez metodę, aby uzyskać wartość właściwości (i oczywiście nie ma metody, która pozwala mu być ustawione).

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 jest już praktycznie egzekwowane przez zachowanie JS przy braku setera. Problemem jest cicha natura - po cichu połykająca wartość. Idealnym (i miejmy nadzieję, że nadchodzi) rozwiązaniem byłoby umożliwienie członkom interfejsu TS oznaczenia jako posiadającego tylko program pobierający \ ustawiający. Alternatywą byłoby dla transpilatora generowanie pustego ustawiacza gettera w przypadku jego braku, co po prostu powodowałoby błąd (przynajmniej dla nastawcy jest to zachowanie oczekiwane przez cały nasz zespół). Ostateczne żmudne rozwiązanie polega na tym, by zawsze ustawiać osobę rzucającą, jeśli nie jest potrzebny rzeczywisty seter. –

+0

'Readonlyness jest już prawie egzekwowane przez zachowanie JS przy braku setera." Tak "chociaż przez" wymuszony ", mówiłem więcej o ostrzeżeniu kompilatora, falistych czerwonych liniach i jakimś dźwiękowym alarmie. Przykładowy kod pokazuje dyskretne odrzucenie ustawionej próby. W międzyczasie użycie metody dostępu do właściwości jest jedynym sposobem na uzyskanie czasu kompilacji gwarantującego, że nie podjęto próby zestawienia. – Fenton

+0

Wystąpił problem z GitHub na temat tego problemu https://github.com/Microsoft/TypeScript/issues/814 –