2014-10-03 59 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 2015-04-16 18:19:44

回答

1

這是一個有趣的問題。只讀屬性的概念在TypeScript中與其他語言略有不同。

在許多語言中,如果您嘗試設置屬性,但使用getter(但不設置setter)的屬性會引發編譯器錯誤,但TypeScript不會。

該屬性仍是隻讀的,因爲如果嘗試設置它,則不會產生任何影響;該集將失敗默默。

這裏是沒有任何接口的例子:

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

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

沒有編譯器警告,當我使用x.name = 'Example 2';

如果有一個編譯器警告,我後來希望有一種方法來指定接口內屬性的只讀性。正如你所期望的,鑑於上述信息,你不能在接口上設置只讀屬性。

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

只有在缺少setter的情況下,JS的行爲才能實現Readonlyness。問題在於它的沉默 - 悄悄地吞噬價值。理想(並希望來臨)解決方案將允許TS接口成員被標記爲只有getter \ setter。另一種方法是讓轉譯者在沒有它的情況下生成空的getter setter,這隻會引發錯誤(至少對於setter來說,這是我們整個團隊預期的行爲)。如果不需要實際的設置者,最後繁瑣的解決方法是始終用手做出投擲的二傳手。 – 2014-10-03 15:30:47

+0

'Readonlyness已經被JS的行爲強制執行了,因爲沒有setter.'是的 - 儘管通過「強制執行」,我更多地討論編譯器警告,紅色曲線和某種聲音警報。示例代碼顯示了設置嘗試的無聲丟棄。與此同時,使用屬性訪問方法是獲得編譯時間的唯一方法,以保證不嘗試進行任何嘗試。 – Fenton 2014-10-03 15:48:05

+0

在GitHub上提出了關於這個問題的一個問題https://github.com/Microsoft/TypeScript/issues/814 – 2014-10-03 20:42:55