2016-11-06 4 views
2

Итак, здесь я пытаюсь создать тип интерфейса объекта, который будет содержать только определенные интерфейсы. Например:Как объявить итерируемый объект другого типа интерфейса?

export interface IUser { 
    name: string; 
    last: string; 
}; 

export interface IRoom { 
    users: Object<IUser>; // this is wrong. 
} 

Я ожидаю, что пользователи будут что-то вроде:

Users: { 
    'user_id_goes_here': { 
    name: 'John', 
    last: 'Doe' 
    }, 
    'user_id_goes_here': { 
    name: 'Albert', 
    last: 'Einstein' 
    }, 
    ... 
} 

Есть ли способ, чтобы определить тип элемента интерфейса, как это?

ответ

3

Я думаю, что вы хотите что-то вроде этого:

export interface Room { 
    users: UserMap; 
} 

export interface UserMap { 
    [userId: string]: User; 
} 

export interface User { 
    name: string; 
    last: string; 
}  

Это [userId: string]: IUser; является то, что называется строка индекса подписи. Это означает, что всякий раз, когда вы используете строку для индексации в UserMap, вы получите IUser.

+0

Спасибо за ответ! Я не был уверен, что я должен искать в Google. Теперь я помню, что это тип карты. – Nika

+0

Несомненно, подписи индекса предназначены для моделирования объектов, подобных карте, в JavaScript, но не очевидно, что они будут вызывать. Надеюсь, кто-то ищет этот ответ. В качестве хэдз-ада, если все, что вы используете для этого типа, это тип, вы можете использовать декларацию 'interface' вместо' class' (так как '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –

+0

Вы правы. Я забыл упомянуть интерфейс, это был быстро написанный пример, не задумываясь и усталый. Спасибо за консультацию! P.S отредактировал вопрос, заменил класс на интерфейс. – Nika