我是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;
}
和TypeScript引发了一个错误:error TS2339: Property 'someKey' does not exist on type 'T'.
这是我无法得到它的部分。如果ObjectInterface
有someKey
并且作为通用类型传递给createModel
,那么为什么obj
没有看到&#39}它作为它的财产?
如果谷歌有答案,那么请给我一个提示,我应该搜索哪些键? ;)
答案 0 :(得分:0)
目前,在createModel<T>
函数中,T
几乎可以是任何内容(any
)。因此,在编译时无法保证T
类型的变量实际上包含属性someKey
。例如,假设有人使用createModel<SomeOtherInterface>(...)
调用您的方法时SomeOtherInterface
没有someKey
属性,或者使用createModel<string>(...)
。
您可以通过在该类型参数上制定 constaint 来强制使用T
所用的任何类型参数作为ObjectInterface
的子类型:
createModel<T extends ObjectInterface>(someArray: T[]): SomeInterface {
// ...
}
有关泛型的更多信息,请查看the respective section of the documentation。