2017-05-19 78 views
1

我有一個非常複雜的對象,我想要擴展和重寫一個特定的屬性的多個屬性。如何擴展接口並覆蓋屬性的類型?

interface ComplicatedObject { 
    propertyOne: string, 
    propertyTwo: null 
} 

interface MoreComplicatedObject extends ComplicatedObject { 
    propertyTwo: string 
} 

本質上,對象與ComplicatedObject類型通過向propertyTwo分配一個字符串值被轉換爲MoreComplicatedType。我想避免在propertyTwo上使用聯合類型,因爲所有使用propertyTwo的調用都假定它是一個字符串,而不是空值,所以我寧願不必在每次訪問propertyTwo時都包含類型檢查。

如何擴展接口並覆蓋現有屬性的類型?

+0

這樣做會違反Liskov替換原則。你可以使'ComplicatedObject'成爲一個通用的接口,並且使泛型的'propertyTwo'成爲可能?這樣你根本不需要'MoreComplicatedObject',並且不違反LSP。 TypeScript 2.3支持默認的類型參數,因此您不必始終提供參數。 – Amy

+0

你可以做的另一件事是使用'Pick'類型來挑選你想保持的屬性,然後添加你想要的任何類型的新屬性。像''MoreComplicatedObject'擴展Pick {propertyTwo:string; }' – Aaron

回答

1

只有擴展接口中的類型與該屬性的原始類型兼容時,纔可以在擴展接口時覆蓋屬性類型。通常的情況是,當你用更限制的類型覆蓋它時。

這意味着你必須具有遠見,並聲明原始屬性的類型與所有可能的擴展名兼容。你的情況,你可以在ComplicatedObject使用union類型:

interface ComplicatedObject { 
    propertyOne: string, 
    propertyTwo: null | string 
} 

interface MoreComplicatedObject extends ComplicatedObject { 
    propertyTwo: string 
} 

也可以使CompicatedObject通用在this answer描述。