传递泛型类型并使用type属性

时间:2017-01-04 20:38:34

标签: generics typescript

我是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'. 这是我无法得到它的部分。如果ObjectInterfacesomeKey并且作为通用类型传递给createModel,那么为什么obj没有看到&#39}它作为它的财产?

如果谷歌有答案,那么请给我一个提示,我应该搜索哪些键? ;)

1 个答案:

答案 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