2012-10-11 50 views
47

目前,TypeScript不允許在接口中使用get/set方法(訪問器)。 例如:是否可以在接口定義中使用getters/setters?

interface I { 
     get name():string; 
} 

class C implements I { 
     get name():string { 
      return null; 
     } 
} 

此外,打字稿不允許在類中的方法使用Array函數表達式: 爲前:

class C { 
    private _name:string; 

    get name():string => this._name; 
} 

有沒有我可以使用一個getter和setter上任何其他方式一個接口定義?

回答

64

可以指定接口的屬性,但不能強制執行是否使用getter和setter方法,就像這樣:

interface IExample { 
    Name: string; 
} 

class Example implements IExample { 
    private _name: string = "Bob"; 

    public get Name() { 
     return this._name; 
    } 

    public set Name(value) { 
     this._name = value; 
    } 
} 

var example = new Example(); 
alert(example.Name); 

在這個例子中,接口不強制類使用getter和setter,我可以使用一個屬性來代替(下面的例子) - 但是接口應該隱藏這些實現細節,因爲它是對調用代碼的承諾,可以調用它。

interface IExample { 
    Name: string; 
} 

class Example implements IExample { 
    // this satisfies the interface just the same 
    public Name: string = "Bob"; 
} 

var example = new Example(); 
alert(example.Name); 

最後,=>不允許類方法 - 你可以start a discussion on Codeplex,如果你覺得有一個燃燒的情況下使用它。這裏有一個例子:

class Test { 
    // Yes 
    getName =() => 'Steve'; 

    // No 
    getName() => 'Steve'; 

    // No 
    get name() => 'Steve'; 
} 
+0

也有一個EC5 Shim你可以使用'=>'來定義這樣的類方法:'name =(a:string)=> this._name;'但在輸出JS中,它將在類函數內部定義,而不是擴展其原型對象。 – orad

3

首先,打字稿只支持getset語法時靶向的EcmaScript 5.要做到這一點,你必須調用編譯器與

tsc --target ES5 

接口不支持getter和setter。爲了讓您的代碼編譯,你必須將其更改爲

interface I { 
    getName():string; 
} 

class C implements I { 
    getName():string { 
      return null; 
    } 
} 

什麼打字稿不支持是在構造領域的特殊語法。在你的情況,你可以有

interface I { 
    getName():string; 
} 

class C implements I { 
    constructor(public name: string) { 
    } 
    getName():string { 
     return name; 
    } 
} 

注意如何類C不指定字段name。它實際上是在構造函數中使用語法糖public name: string來聲明的。如Sohnee指出的那樣,接口實際上應該隱藏任何實現細節。在我的示例中,我選擇了需要java樣式getter方法的接口。但是,您也可以使用一個屬性,然後讓該類決定如何實現該接口。

+1

您可以在TypeScript中使用'get'和'set'關鍵字。 – Fenton

+0

謝謝。我已經更新了我的答案。 – Valentin

+0

有關ECMAScript 5支持的注意事項 - IE8 +,FF4 +,Opera 12+,WebKit和Safari支持'Object.defineProperty'。在https://github.com/kriskowal/es5-shim – Fenton

14

爲了補充其他的答案,如果你的願望是在接口上定義get value,你可以這樣做:

interface Foo { 
    readonly value: number; 
} 

let foo: Foo = { value: 10 }; 

foo.value = 20; //error 

class Bar implements Foo { 
    get value() { 
    return 10; 
    } 
} 

但據我所知,正如其他人提到的那樣,目前沒有辦法在界面中定義一個純集屬性。你可以,但是,移動限制到一個運行時錯誤(有用的,只有在開發過程中):

interface Foo { 
    /* Set Only! */ 
    value: number; 
} 

class Bar implements Foo { 
    _value:number; 
    set value(value: number) { 
    this._value = value; 
    } 
    get value() { 
    throw Error("Not Supported Exception"); 
    } 
} 

不推薦的做法;但是一個選項。

相關問題