TypeScript中如何正确定义泛型Map的类型?
解决TypeScript中带类型安全的Map创建问题
嘿,我来帮你搞定这个TypeScript的类型问题!你遇到的核心问题是泛型的写法位置不对,其实完全不用依赖any,只要调整类型注解的写法就能保留完整的类型安全性。
首先看最直接的正确写法——你已经定义了MetaDataType类型,只需要把它的数组类型作为Map的值类型即可:
type MetaDataType = { target: Function; propertyName: string; }; private _getMetaDataCache: Map<Function, MetaDataType[]> = new Map();
如果需要更精确的泛型约束
要是你希望MetaDataType里的target是某个特定的函数类型(而不是宽泛的Function),可以把MetaDataType改成泛型类型:
// 定义泛型的元数据类型 type MetaDataType<T extends Function> = { target: T; propertyName: string; }; // 示例:指定Map的key和target为同一个特定函数类型 private _getMetaDataCache: Map<typeof MySpecificFunction, MetaDataType<typeof MySpecificFunction>[]> = new Map();
如果你的整个类都需要支持任意函数类型的泛型,还可以把类本身声明为泛型:
class MetaDataManager<T extends Function> { private _getMetaDataCache: Map<T, MetaDataType<T>[]> = new Map(); }
为什么你原来的写法无效?
你之前写的<T extends MetaDataType>[]是错误的语法——泛型参数应该放在类型定义的外层(比如Map的类型参数列表里,或者单独定义泛型类型时),而不是直接嵌套在数组类型前面。我们已经有了明确的MetaDataType类型,直接用它的数组类型就能保证类型安全啦。
内容的提问来源于stack exchange,提问作者kentor
相关产品推荐
相关产品推荐

