typescript - Ingen indexsignatur med en parameter av typen 'string' hittades på typ '


Jag arbetade på mitt första Firebase TypeScript-funktionsprojekt

Jag har följande kodsnutt.

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
        }
    }

I detta, på denna rad får jag följande fel const ApiClass=require(files[file])

Elementet har implicit typen 'any' eftersom ett uttryck av typen 'string' inte kan användas för att indexera typen '{ status: string; invite: string; user: string; auth: string; social: string; }'. Ingen indexsignatur med en parameter av typen 'string' hittades på typen '{ status: string; invite: string; user: string; auth: string; social: string; }'

Primär fråga: Kan någon hjälpa mig att lista ut vad jag gör fel här?

Svar #1

Typfelet visas eftersom du har aktiverat "noImplicitAny": true i tsconfig.

Om du vill behålla "noImplicitAny": true, finns det 2 lösningar på ditt problem, välj någon av dem.

  1. const ApiClass = require(files[file as keyof typeof files])
  2. const files: { [key: string]: string } = { ... }

Efter lite efterforskning tror jag att det optimala sättet är att utöka Object.prototype.hasOwnProperty()-metodens signatur.

// somewhere in your project, write:

interface Object {
  hasOwnProperty<T>(this: T, v: any): v is keyof T
}

På detta sätt fungerar .hasOwnProperty som en typvakt som automatiskt begränsar typen av file till keyof typeof files.

Relaterade artiklar