获取通用类型的属性

时间:2018-12-12 09:20:05

标签: angular typescript typescript2.0

在angular6项目中,我们激活了"noImplicitAny": true设置,发现这给从泛型类型中检索值带来了一些问题。

此刻,我们通过current['orderBy']检索值,但这会产生以下错误:Element implicitly has an 'any' type because type '{}' has no index signature.

我们可以通过将电流投射到任何(<any>current)['orderBy']来解决此问题,但是在我们看来,这是较差的编码。

我们已经尝试过强制转换'orderBy'current['orderBy' as keyof T],但这不是很好的代码,并且为检索到的属性提供了错误的类型(:T[keyof T]),在这种情况下,该类型无法用于计算(在这种情况下,它应该是数字类型)

如果您可以传递泛型类型和我们想要获取值的属性的名称(在此处https://blog.mariusschulz.com/2017/01/06/typescript-2-1-keyof-and-lookup-types),我们也试图创建一个函数。

export const prop = <T, K extends keyof T>(obj: T, key: K) => { return obj[key]; };

current不是通用类型的情况下有效,但是它会产生以下错误:Argument of type '"orderBy"' is not assignable to parameter of type 'keyof T'

那么,有谁知道另一种方法来检索可能有用的泛型类型的属性值? (同样在这种情况下,我们尝试检索的是orderBy,但是它可以是通用类型的任何其他字段)

1 个答案:

答案 0 :(得分:0)

如果您具有不受限制的类型参数,则由于typescript不知道此类访问是否有效,因此它不会让您访问该类型的任何属性。如果没有noImplictAny,它可以工作,因为您可以访问任何类型的任何属性。

没有任何隐含的内容,您将需要更加明确地了解泛型类型具有哪些属性以及它们可能的类型是什么:

class Foo<T extends { orderBy: string }> {
    m(current: T) {
        let o = current['orderBy']; // string
        let o2 = current.orderBy; // or just . notation
    }
}