如何手动改写返回any类型的库函数类型签名?
手动缩小reflect-metadata中getMetadata函数的类型,解决ESLint安全赋值错误
针对getMetadata返回any导致的ESLint"Unsafe assignment of an any value"错误,你可以通过以下几种方式手动缩小类型,无需禁用规则或设置例外:
1. 直接使用类型断言
如果你明确知道元数据的类型,可以直接给返回值加上类型断言,告诉TypeScript你确定该值的类型:
// 明确元数据是string类型 const example = getMetadata('string', myObj) as string; // 如果元数据可能不存在,可选添加undefined类型 const example = getMetadata('string', myObj) as string | undefined;
2. 封装为泛型工具函数
为了避免重复写类型断言,你可以封装一个泛型函数,统一处理类型约束:
function getTypedMetadata<T>(metadataKey: any, target: Object): T | undefined { return getMetadata(metadataKey, target) as T; } // 使用时指定泛型参数,明确期望的类型 const example = getTypedMetadata<string>('string', myObj);
这种方式更具复用性,每次调用只需传入目标类型即可。
3. 自定义类型守卫缩小范围
如果不确定元数据的具体类型,或者需要运行时校验,可以写一个类型守卫函数,让TypeScript自动推导缩小后的类型:
// 定义字符串类型守卫 function isString(value: any): value is string { return typeof value === 'string'; } const example = getMetadata('string', myObj); // 通过类型守卫后,example的类型会被缩小为string if (isString(example)) { console.log(example.length); // 这里可以安全调用字符串方法 }
内容的提问来源于stack exchange,提问作者myol
相关产品推荐
相关产品推荐

