2012-10-11 34 views
47

Şu anda, TypeScript, arabirimlerde get/set yöntemlerini (accessors) kullanmasına izin vermez. ayrıcaArabirim tanımında alıcı/ayarlayıcı kullanmak mümkün mü?

interface I { 
     get name():string; 
} 

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

, typescript sınıf yöntemlerinde kullanılması Dizi İşlev İfade izin vermez: Örneğin: ex .:

class C { 
    private _name:string; 

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

için Ben ayarlayıcı üzerinde bir alıcı kullanabilir ve başka bir yolu var mı bir arayüz tanımı? Her şeyden

cevap

64

Sen arabirimde özelliği belirtebilirsiniz, ancak böyle Alıcılar ve ayarlayıcılar kullanılıp kullanılmadığının zorlayamaz:

Bu örnekte
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); 

, sınıf zorlamaz arayüzü kullanmak alıcılar ve ayarlayıcılar, bunun yerine bir mülk kullanabiliyordum (örnek aşağıda) - fakat arayüzün bu uygulama ayrıntılarını gizlemesinin beklendiği gibi çağrı koduyla ilgili bir söz olduğu için.

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

Ve son olarak, => sınıf yöntemleri için izin verilmez - sen olabilir start a discussion on Codeplex bunun için yanan bir kullanım durumu olduğunu düşünüyorum eğer. İşte bir örnek: sizin arzu bir arabirimde bir get value tanımlamak ise

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

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

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

adresinde EC5 Shim da bulunmaktadır. Bunun gibi sınıf yöntemlerini tanımlamak için '=>' kullanabilirsiniz: 'name = (a: string) => this._name;' ancak çıktı JS'de, prototip nesnesini genişletmekten ziyade sınıf işlevi içinde tanımlanacaktır. – orad

3

Öncelikle typescript sadece ECMAscript 5. hedefleme Bunu başarmak için zaman, alıcıları ve ayarlayıcıları desteklemeyen

tsc --target ES5 

Arabirimler derleyici aramak zorunda get ve set sözdizimi destekler. Eğer neyi destekler typescript

interface I { 
    getName():string; 
} 

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

olarak değiştirmek zorunda kalacak derlemek üzere kodunuzu almak için kurucular alanlar için özel bir sözdizimi. Senin durumunda, sınıf C alan name belirtmez nasıl

interface I { 
    getName():string; 
} 

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

Bildirimi olabilir. Oluşturucuda sözdizimsel public name: string kullanarak bildirilmiştir.

Sohnee'nin belirttiği gibi, arayüz aslında herhangi bir uygulama detayını gizlemelidir. Örneğimde, java tarzı bir getter yöntemi gerektirecek arayüzü seçtim. Bununla birlikte, bir özelliği de yapabilir ve daha sonra sınıfın arayüzün nasıl uygulanacağına karar vermesine izin verebilirsiniz.

+1

"get" ve "set" anahtar sözcüklerini TypeScript'te kullanabilirsiniz. – Fenton

+0

Teşekkürler. Cevabımı güncelledim. – Valentin

+0

ECMAScript 5 desteğindeki bir yan not - 'Object.defineProperty' IE8 +, FF4 +, Opera 12+, WebKit ve Safari'de desteklenir. Https://github.com/kriskowal/es5-shim – Fenton

14

, diğer cevaplar ek için, bunu yapabilirsiniz:

interface Foo { 
    readonly value: number; 
} 

let foo: Foo = { value: 10 }; 

foo.value = 20; //error 

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

ama bildiğim kadarıyla farkındayım olarak ve diğerlerinin de belirttiği gibi, şu anda arayüzde sadece set-özellik özelliğini tanımlamanın bir yolu yoktur. Ancak, (sadece geliştirme döngüsü sırasında faydalıdır) bir çalışma zamanı hatası sınırlama taşıyabilirsiniz:

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

uygulama tavsiye edilmez; ama bir seçenek.