我正在第一个Firebase打字稿功能项目
我有以下代码段。
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])
元素隐式地具有“ any”类型,因为类型的表达式 'string'不能用于索引类型'{status:string;邀请: 串;用户:字符串; auth:字符串;社交:字符串; }'。没有索引 在类型'{上找到了带有'string'类型参数的签名 状态:字符串;邀请:字符串;用户:字符串; auth:字符串;社交: 串; }'
主要问题:有人可以帮我弄清楚我在做什么错吗?
答案 0 :(得分:1)
显示类型错误,因为您在tsconfig中打开了"noImplicitAny": true
。我个人觉得这样的执法令人讨厌和过度杀伤力。我也鼓励您这样做。
如果您想保留"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
。