2016-03-01 12 views
7

ile başa çıkmak: Bu işlertypescript Birliği Türleri: Eğer mantık aynı parça yoluyla çalıştırmak istediğiniz yeterince benzer iki ara yüze sahip bir durumun üstesinden gelmek için uygun yolu nedir arabirimleri

interface DescriptionItem { 
    Description: string; 
    Code: string; 
} 
interface NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    var desc = (<DescriptionItem>i).Description || (<NamedItem>i).Name; 

    return i.Code + ' - ' + desc; 
} 

; Ancak, benim sorum var desc = ... hattını iyileştirmek üzerindedir. En iyi seçeneğin üstünde var mı? Ya da bu durumu Typescript'te işlemenin daha iyi bir yolu var mı?

+0

senin yaptığını yolu iyi görünüyor söyleyebilirim. Bununla birlikte, sorunun kendisi esas olarak fikir temellidir ve bu temelde kapatmak için oy kullanacağım. :) – toskv

cevap

5

TypeScript interfaces yalnızca derleme zamanında var, bu nedenle çalışma zamanında arayüz türlerini test etmek için yapabileceğiniz fazla bir şey yok. Sorunuzda belirttiğiniz kod anlamlıdır ve muhtemelen en iyi seçeneğinizdir. Değiştirmek için esneklik varsa

Ancak; interfacesclasses için, daha zarif tür denetlemesi yapmak typescript tip korumaları kullanabilirsiniz:

class DescriptionItem { 
    Description: string; 
    Code: string; 
} 
class NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    let desc: string; 
    if (i instanceof DescriptionItem) { 
     desc = i.Description; 
    } else { 
     desc = i.Name; 
    } 

    return i.Code + ' - ' + desc; 
} 
+0

Neden 'i.Name' var olup olmadığını kontrol edin ve bu türlere göre farklılaşır? – jocull

+0

@jocull Nesnenin bir örneği "NamedItem" ise, ancak onun adı "undefined" idi? –

+0

İsteğe bağlı olmayan veriler eksikse, gerçekten 'NamedItem' örneğinin bir örneğidir? – jocull

İlgili konular