Arabirim ve Model ne zaman TypeScript / Angular2'de kullanılır


198

Kısa süre önce TypeScript ile Angular 2 ile ilgili bir Öğretici izledim, ancak ne zaman Arayüz kullanılacağından ve veri yapılarını tutmak için bir Model kullanacağından emin değilim.

Arayüz örneği:

export interface IProduct {
    ProductNumber: number;
    ProductName: string;
    ProductDescription: string;
}

Model Örneği:

export class Product {
    constructor(
        public ProductNumber: number,
        public ProductName: string,
        public ProductDescription: string
    ){}
}

JSON verilerini bir URL'den yüklemek ve Arayüz / Model'e bağlamak istiyorum. Bazen tek bir veri nesnesi istiyorum, diğer zaman ben nesneyi tutmak ve dizi istiyorum.

Hangisini kullanmalıyım ve neden?


14
Özel mantık başlangıcına ihtiyacınız olduğunda bir sınıf kullanın, aksi takdirde yalnızca derleme zamanında kullanılabildiği için her zaman bir arabirim kullanın. Bir daktilo arabirimi, javascriptte bulunmadığından javascript için derlenmemiştir.
Dieterg

6
Angular 2'de arayüzlerin bağımlılık enjeksiyonu ile ÇALIŞMAYACAĞINI unutmayın. Burada sınıfları kullanmanız gerekecektir.
jlang

Yanıtlar:


137

Arayüzler sadece derleme zamanındadır. Bu, yalnızca beklenen verilerin belirli bir yapıya uygun olup olmadığını kontrol etmenizi sağlar. Bunun için içeriğinizi bu arayüze yayınlayabilirsiniz:

this.http.get('...')
    .map(res => <Product[]>res.json());

Şu sorulara bakın:

Sınıfla benzer bir şey yapabilirsiniz, ancak sınıfla temel farklar çalışma zamanında mevcut olmalarıdır (yapıcı işlevi) ve içinde işlemlerle yöntemleri tanımlayabilirsiniz. Ancak, bu durumda, nesneleri kullanabilmek için somutlaştırmanız gerekir:

this.http.get('...')
    .map(res => {
      var data = res.json();
      return data.map(d => {
        return new Product(d.productNumber,
          d.productName, d.productDescription);
      });
    });

27
Ayrıntılı cevabınız için teşekkürler. Arabirim yalnızca derleme zamanında kullanılıyorsa, derleyici gerçekte http get'i incelemeden JSON dosyasının yapısını nasıl denetleyebilir? Eğer yapamazsa, o zaman bir arayüzle rahatsız olmanın anlamı nedir?
I_LIKE_FOO

7
@I_LIKE_FOO derleyicinin alma çağrısını incelemesi gerekmez. Sadece bildiği türlerin kontrol edilmesine ve doğru hizalanmasına özen gösterir. var data = res.json();gerçekten var data: any = res.json();derleyiciye olduğunu, bu yüzden tüm tip kontrolünü kaybettik data. Burada hangisi daha faydalı olacaktır gibi bir şey olurdu var data: ProductDto[] = res.json();ile ProductDtobir arayüz olma modelleyen döndü json veri yapısı.
GFoley83

3
Daha fazla Angular style guide says not to use interfaces.Always use classes.bilgi için bkz : angular.io/guide/styleguide#style-03-03
Sampath

4
Evet, ama sorun şu ki, onlar Typcript'i tasarlayan guru tanrıları değiller. Bu Microsoft ve şirket olurdu. Arayüzleri ve uygun olduğunda sınıfları tercih etme eğilimindedirler. Ayrıca bonus puanları ... biri çalışma zamanı, diğeri derleme zamanı
Tom Stickel

11
@Sampath Belki de Açısal stil kılavuzu şu an gördüğüm gibi güncellenmiştir: "Veri modelleri için bir arabirim kullanmayı düşünün." Veri modelleri için sınıf yerine arabirimi tercih eder.
Mikezx6r

40

Arayüz bir için bir sözleşme ya açıklar sınıfın veya yeni tip . Saf bir Typcript öğesidir, bu nedenle Javascript'i etkilemez.

Bir model ve bir sınıf , yeni nesneler oluşturmak için kullanılan gerçek bir JS işlevidir.

JSON verilerini bir URL'den yüklemek ve Arayüz / Model'e bağlamak istiyorum.

Bir model seçin, aksi takdirde Javascript'inizde JSON olacaktır.


4

@ThierryTemplier sunucudan veri almak ve bileşenler arasında (akıllı liste tutmak ve tasarım zamanı hatası yapmak için) model iletmek için söylediği gibi, arayüz kullanmak iyidir ama sunucuya veri göndermek için düşünüyorum (DTOs) almak için sınıf kullanmak daha iyidir modelden DTO otomatik haritalamanın avantajları.


-22

Tüm araştırmalarımdan sonra keşfettiğim şey Interface yerine Class'u kullan .

Neden? Tek başına bir sınıf, bir sınıf artı arabirimden daha az koddur. (yine de veri modeli için bir Sınıfa ihtiyacınız olabilir)

Neden? Bir sınıf arabirim görevi görebilir (genişletmeler yerine uygular kullanın).

Neden? Bir arayüz sınıfı, Açısal bağımlılık enjeksiyonunda bir sağlayıcı arama jetonu olabilir.

Açısal Stil Kılavuzundan

Temelde bir Sınıf bir Arabirimin ne yapacağını yapabilir. Bu yüzden asla Arayüz kullanmanız gerekmeyebilir .


10
Açısal Stil Kılavuzu şu anda “ Veri modelleri için bir arayüz kullanmayı düşünün .
Alex Peters

@AlexPeters Lütfen gerçek bir bağlantı sağlayın. Şimdiden teşekkürler
Anand Phadke

@AnandPhadke, yukarıdaki yorumumun zamanından itibaren Açısal Stil Kılavuzuna bir Wayback Machine bağlantısı .
Alex Peters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.