首页 > 解决方案 > 获取泛型类型的属性

问题描述

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

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

我们可以通过将 current 转换为 any 来解决这个问题(<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,但它可以是泛型类型的任何其他字段)

标签: angulartypescripttypescript2.0

解决方案


如果您有一个不受约束的类型参数,打字稿将不允许您访问该类型的任何属性,因为它不知道此类访问是否有效。如果没有noImplictAny这个工作,您可以访问任何类型的任何属性。

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

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

推荐阅读