o arayüz tanımı getters / ayarlayıcıları kullanmak mümkün mü?

oy
50

Şu anda, TypeScriptarayüzlerinde kullanılması get / set yöntemleri (erişimcileri) izin vermez. Örneğin:

interface I {
      get name():string;
}

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

dahası typescript sınıf yöntemlerinde kullanılması Dizi İşlev İfade izin vermez: ex .:

class C {
    private _name:string;

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

Bir arayüz tanımı bir alıcı ve ayarlayıcı kullanabileceğim başka bir yolu var mı?

Oluştur 11/10/2012 saat 12:15
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
68

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

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

Bu örnekte, arayüz Alıcılar ve ayarlayıcılar kullanmaya sınıfını zorlamaz, ben (örnek aşağıdadır) yerine bir özellik kullanılmış olabilir - ama arayüzü çağıran koduna bir sözdür olarak zaten bu uygulama ayrıntılarını gizlemek gerekiyordu o dediğimiz hakkında.

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 Codeplex üzerinde bir tartışma başlatmak bunun için yanan bir kullanım durumu olduğunu düşünüyorum eğer. İşte bir örnek:

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

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

    // No
    get name() => 'Steve';
}
Cevap 11/10/2012 saat 13:03
kaynak kullanıcı

oy
16

Arzu bir tanımlamak için ise diğer cevaplar ek için, get valuebir arabirimde, bunu yapabilirsin:

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, ve diğerleri de belirtildiği gibi, arayüzde bir set sadece özellik tanımlamak için şu anda hiçbir yolu yoktur olarak. Ancak, bir çalışma zamanı hatası sınırlama taşıyabilirsiniz (geliştirme döngüsü sırasında kullanışlı için):

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 önerilmez ; ancak bir seçenek.

Cevap 13/12/2016 saat 11:32
kaynak kullanıcı

oy
2

Her şeyden önce, typescript sadece destekler getve setECMAscript 5. hedef alan Bunu başarmak için zaman sözdizimi, sizinle derleyici aramak zorunda

tsc --target ES5

Arayüzler Alıcılar ve ayarlayıcılar desteklemez. derlemek için kodunuzu almak için bunu değiştirmek zorunda kalacak

interface I { 
    getName():string;
}

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

Ne typescript destek kurucularınızdaki alanlar için özel bir sözdizimi yok. Senin durumunda, sahip olabilirdi

interface I {
    getName():string;
}

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

Sınıf nasıl dikkat Calanını belirtmez name. Aslında sözdizimsel şeker kullanılarak bildirilir public name: stringyapıcısı içinde.

Sohnee işaret ettiği gibi, arayüz aslında herhangi uygulama ayrıntılarını gizlemek gerekiyordu. Benim örnekte, bir java tarzı alıcı yöntem gerektirir arayüzü tercih etti. Ancak, aynı zamanda bir özellik ve daha sonra sınıf arabirimini nasıl uygulanacağı karar sağlayabilirsiniz.

Cevap 11/10/2012 saat 12:45
kaynak kullanıcı

oy
0

Typescript 3.4 kullanma:

interface IPart {
    getQuantity(): number;
}

class Part implements IPart {
    private quantity: number;
    constructor(quantity: number) {
        this.quantity = quantity;
    }
    public getQuantity = (): number => {
        return this.quantity;
    };
}

let part = new Part(42);

// When used in typescript, quantity is not accessible.
// However, when compiled to javascript it will log '42'.
console.log(part.quantity);

// Logs '42'.
console.log(part.getQuantity());

Örneğe bakın typescript Oyun .

Cevap 25/05/2019 saat 17:30
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more