在类型“

时间:2019-11-12 04:04:57

标签: typescript

我正在第一个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:字符串;社交:   串; }'

主要问题:有人可以帮我弄清楚我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

显示类型错误,因为您在tsconfig中打开了"noImplicitAny": true。我个人觉得这样的执法令人讨厌和过度杀伤力。我也鼓励您这样做。

如果您想保留"noImplicitAny": true,那么有2种解决方案可以解决您的问题,请选择其中一种。

  1. const ApiClass = require(files[file as keyof typeof files])
  2. 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