typescript - 在类型 ' 上找不到具有类型参数的索引签名
问题描述
我正在研究我的第一个 firebase typescript 函数项目
我有以下代码片段。
const files = {
status: './src/api/status.f.js',
invite: './src/api/invite.f.js',
user: './src/api/user.f.js',
auth: './src/api/auth.f.js',
social: './src/api/social.f.js'
}
for (let file in files)
if (files.hasOwnProperty(file)) {
// Setting function name equivalent to the file name
if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === file) {
const ApiClass = require(files[file])
const app = new ApiClass(context)
exports[file] = app.handler
}
}
在这一行,我收到以下错误const ApiClass = require(files[file])
元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“{状态:字符串;邀请:字符串;用户:字符串;身份验证:字符串;社交:字符串;}'。在“{ status: string; 类型”上找不到带有“string”类型参数的索引签名;邀请:字符串;用户:字符串;身份验证:字符串;社交:字符串;}'
主要问题:有人可以帮我弄清楚我在这里做错了什么吗?
解决方案
显示类型错误是因为您"noImplicitAny": true
在 tsconfig 中打开了。
如果您想保留"noImplicitAny": true
,那么有 2 个可以解决您的问题,请选择其中一个。
const ApiClass = require(files[file as keyof typeof files])
const files: { [key: string]: string } = { ... }
经过一番挖掘,我认为最佳方法是增加Object.prototype.hasOwnProperty()
方法的签名。
// somewhere in your project, write:
interface Object {
hasOwnProperty<T>(this: T, v: any): v is keyof T
}
这种方式.hasOwnProperty
充当类型保护,自动缩小file
类型keyof typeof files
。
推荐阅读
- function - 定义具有属性 f(a,b,c) = f(c,a,b) = f(b,c,a) 的函数
- vue.js - 如何在 vue.js 中添加标签管理器
- swift - How can to get string range location in swift?
- time-complexity - 您如何计算组合的增长顺序?
- algorithm - 如何缩放和加权给定值的适应度?
- ios - saving in ios keychain is not persistent
- html - when the page extends the scroll does not appear
- android - Storing/Moving photo to a separate app folder in the phone
- rxjs - Rxjs - Is there a static creation operator behaves like 'switchMap'?
- c# - 如何使用 C# 枚举 GridFS 中的文件