2017-02-23 55 views
0

У меня есть следующая машинопись интерфейс:машинописи, как объявить вложенный тип данных от интерфейса

interface IFoodShop { 
    name: string; 
    owner: string; 
    foods: Array<{ 
     id: number, 
     name: string, 
     isVegetarian: boolean 
    }> 
} 

У меня есть функция, которая требует, чтобы быть В параметре тот же типа данных как массив еды из интерфейса IFoodShop. Как я объявляю это, похоже на что-то такое, что не работает.

// check if food is vegetarian 
isVegatarianFood(data: IFoodShop.foods) { 


} 

Я понимаю, что я могу сломать типы данных, как показано ниже:

interface IFoodShopFood { 
    id: number, 
    name: string, 
    isVegetarian: boolean 
} 

interface IFoodShop { 
    name: string; 
    owner: string; 
    openDate: Date; 
    foods: IFoodShopFood 
} 

// check if food is vegetarian 
isVegatarianFood(data: IFoodShopFood) { 


} 

Но это мне кажется ненужным, когда у меня есть много массивов декларировать. Как я могу просто сказать, что тип данных должен соответствовать продуктам типа данных вложенных интерфейсов?

+0

Я думаю, во втором примере он должен быть 'продуктов: IFoodShopFood []', в противном случае это не массив больше , Что вы подразумеваете под ненужным? Если вы хотите использовать типы в нескольких местах, вы должны определить их. Вы также можете определить новый тип, который будет таким же структурным, но это будет много накладных расходов. –

ответ

1

Но это мне кажется ненужным, когда у меня много массивов для объявления.

С машинописью ночного (I recommend nightly), вы можете использовать следующий синтаксис:

interface IFoodShop { 
    name: string; 
    owner: string; 
    foods: Array<{ 
     id: number, 
     name: string, 
     isVegetarian: boolean 
    }> 
} 
// check if food is vegetarian 
function isVegatarianFood(data: IFoodShop['foods']) { } 

isVegatarianFood([{ id: 123, name: '123', isVegetarian: true }]); // okay 
isVegatarianFood([{ id: 123, name: '123', isVegetarian: 'ERRROR' }]); // ERROR