angular - 获取泛型类型的属性
问题描述
在我们的 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,但它可以是泛型类型的任何其他字段)
解决方案
如果您有一个不受约束的类型参数,打字稿将不允许您访问该类型的任何属性,因为它不知道此类访问是否有效。如果没有noImplictAny
这个工作,您可以访问任何类型的任何属性。
没有任何隐含,您将需要更明确地了解您的泛型类型具有哪些属性以及它们可能的类型是什么:
class Foo<T extends { orderBy: string }> {
m(current: T) {
let o = current['orderBy']; // string
let o2 = current.orderBy; // or just . notation
}
}
推荐阅读
- spring-security - 如何让 Spring 忽略 botframework 端点中的令牌
- python - 基于 Apache Beam KafkaIO python SDK 处理 Avro 消息
- javascript - 数组中唯一偶数的加法
- unity3d - 如何在 Unity 中渲染关于网格分类的文本
- python - Python将数据框行转置为列名,列转置为行
- keras - 将带有 Keras 模型的 Tkinter 项目转换为 exe
- python - 尝试使用包时出现未解决的参考错误
- python - python xor 只呈现零?
- javascript - 在 n8n javascript 中迭代嵌套数组输出的问题
- python - 导入文件时出现 Python 错误:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[SDLApplication macOSVersion]