2017-01-04 2 views
0

Я совершенно новый в TypeScript, и несмотря на то, что у меня есть красные документы, я просто не могу добиться того, что хочу с помощью генериков.Пропустить общий тип и свойство типа использования

Я хочу сделать что-то вроде этого:

declare interface ObjectInterface { 
    someKey: string 
} 

const model: SomeInterface = createModel<ObjectInterface>(someArrayOfObjects); 

и здесь createModel метод:

private createModel<T>(someArray: T[]): SomeInterface { 
    const model: SomeInterface = (...someCode...); 

    someArray.forEach((obj: T) => { model.doSomething(obj.someKey) }); 

    return model; 
} 

и машинопись бросает мне ошибку: error TS2339: Property 'someKey' does not exist on type 'T'. Вот та часть, которую я не возьми. Если ObjectInterface имеет someKey и передается как общий тип createModel, то почему obj не «видит» его как свое имущество?

Если у вас есть ответ в Google, пожалуйста, дайте мне подсказку, какие ключи следует искать? ;)

+1

Вы должны добавить ограничение на 'T':' createModel (someArray: T []): SomeInterface {...} ' – Lee

+0

Спасибо, я нашел это также в документах, но почему-то я думал что это только для вещей, которые специально не установлены на интерфейсе, например '.length'. Я думал, что если я передам ObjectInterface, тогда TS просто узнает, что есть этот ключ. – Rob

ответ

0

В настоящее время в пределах вашей функции createModel<T>T может быть буквально любым (any). Из-за этого во время компиляции не может быть гарантировано, что переменная типа T фактически содержит свойство someKey. Например, подумайте о том, чтобы кто-то звонил вашему методу с createModel<SomeOtherInterface>(...) с SomeOtherInterface, не имея свойства someKey, или даже с createModel<string>(...).

Можно принудительно, что любой параметр типа используется для T должен быть подтипом ObjectInterface формулируя constaint по этому параметру типа:

createModel<T extends ObjectInterface>(someArray: T[]): SomeInterface { 
    // ... 
} 

Посмотрите the respective section of the documentation для получения дополнительной информации о дженериков.

+0

Большое спасибо. По моему вопросу Ли написал такое же предложение, поэтому я просто скопирую вставку, что я там написал: я нашел это также в документах, но почему-то думал, что это только для вещей, которые специально не установлены на интерфейсе, например '.length'. Я думал, что если я передам ObjectInterface, тогда TS просто узнает, что есть этот ключ. – Rob

Смежные вопросы