Typoskript: TS7006: Der Parameter 'xxx' hat implizit den Typ 'any'


143

Beim Testen meines UserRouter verwende ich eine JSON-Datei

data.json

[
  {
    "id": 1,
    "name": "Luke Cage",
    "aliases": ["Carl Lucas", "Power Man", "Mr. Bulletproof", "Hero for Hire"],
    "occupation": "bartender",
    "gender": "male",
    "height": {
      "ft": 6,
      "in": 3
    },
    "hair": "bald",
    "eyes": "brown",
    "powers": [
      "strength",
      "durability",
      "healing"
    ]
  },
  {
  ...
  }
]

Beim Erstellen meiner App wird der folgende TS-Fehler angezeigt

ERROR in ...../UserRouter.ts
(30,27): error TS7006: Parameter 'user' implicitly has an 'any' type.

UserRouter.ts

import {Router, Request, Response, NextFunction} from 'express';
const Users = require('../data');

export class UserRouter {
  router: Router;

  constructor() {
  ...
  }

  /**
   * GET one User by id
   */
  public getOne(req: Request, res: Response, _next: NextFunction) {
    let query = parseInt(req.params.id);
 /*[30]->*/let user = Users.find(user => user.id === query);
    if (user) {
      res.status(200)
        .send({
          message: 'Success',
          status: res.status,
          user
        });
    }
    else {
      res.status(404)
        .send({
          message: 'No User found with the given id.',
          status: res.status
        });
    }
  }


}

const userRouter = new UserRouter().router;
export default userRouter;

4
Können Sie uns Ihre zeigen tsconfig? noImplicitAnyWie es aussieht, haben Sie aktiviert und das ist es, was den Fehler verursacht.
— Sebastian Sebald

Antworten:


207

Sie verwenden das --noImplicitAnyund TypeScript weiß nichts über den UsersObjekttyp. In diesem Fall müssen Sie den userTyp explizit definieren .

Ändern Sie diese Zeile:

let user = Users.find(user => user.id === query);

dafür:

let user = Users.find((user: any) => user.id === query); 
// use "any" or someother interface to type this argument

Oder definieren Sie den Typ Ihres UsersObjekts:

//...
interface User {
    id: number;
    name: string;
    aliases: string[];
    occupation: string;
    gender: string;
    height: {ft: number; in: number;}
    hair: string;
    eyes: string;
    powers: string[]
}
//...
const Users = <User[]>require('../data');
//...

24
Fügen Sie in Ihrer tsconfig.json dieses "noImplicitAny": false zu "compilerOptions" hinzu: {} es wird funktionieren
— Naval Kishor Jha

7
@ naval-kishor-jha, aber noImplicitAny ist eine gute Option. Wir müssen eine Lösung finden, bei der noImplicitAny als wahr gilt. Ist das ein Typoskript-Problem?
— AhammadaliPK

1
Manchmal stoße ich auf dieses Problem, dann suche ich schnell auf StackOverflow. Ich sehe meine Stimme für Sie, jedes Mal, wenn ich sauer auf mich selbst für dieses Problem bin :) Ich hoffe, ich werde diese Seite nie sehen
— Metin Atalay

54

Stellen Sie in Ihrer tsconfig.jsonDatei den Parameter "noImplicitAny": falseunter ein compilerOptions, um diesen Fehler zu beseitigen.


32
Vorsichtig. Diese Problemumgehung hebt den Fehler auf und behebt nur das Symptom. Es behebt nicht die Grundursache.
— jbmusso

3
@jbmusso ist richtig. Versuchen Sie, den strengen Modus zu verwenden, anstatt ihn herunterzufahren. Auf diese Weise werden Sie zur Laufzeit keine Fehler finden
— Ionel Lupu

5

Ich bin auf diesen Fehler gestoßen und habe festgestellt, dass der Parameter "strict" in der Datei tsconfig.json auf true gesetzt wurde. Setzen Sie es einfach (offensichtlich) auf "falsch". In meinem Fall hatte ich die tsconfig-Datei über die cmd-Eingabeaufforderung generiert und einfach den "strict" -Parameter übersehen, der sich weiter unten in der Datei befand.


4
Das Setzen des strengen Modus auf false ist sehr schlecht. Während der Kompilierungszeit werden keine Fehler mehr angezeigt, aber zur Laufzeit, die Sie nicht möchten. Ich empfehle dringend, den strengen Modus auftrue
— Ionel Lupu

5

Wenn Sie eine Fehlermeldung erhalten, hat der Parameter 'element' implizit den Typ 'any'. Veterur (7006) in vueJs

mit dem Fehler:

 exportColumns.forEach(element=> {
      if (element.command !== undefined) {
        let d = element.command.findIndex(x => x.name === "destroy");

Sie können dies beheben, indem Sie diese Variablen wie folgt definieren.

korrigierter Code:

exportColumns.forEach((element: any) => {
      if (element.command !== undefined) {
        let d = element.command.findIndex((x: any) => x.name === "destroy");

Das war genau das, was ich brauchte, danke. Das 'Element' des ForEach musste in Klammern umgeben sein, bevor ihm ein Typ zugewiesen werden konnte. dh .forEach ((Element: Objekt) ...
— CodeThief

2

Sehr sortierte und effektive Lösung ist unten: -

Fügen Sie die folgende Regel in Ihre Datei tsconfig.json ein: -

"noImplicitAny": false

Starten Sie dann Ihr Projekt neu.


0

Minimale Fehlerwiedergabe

export const users = require('../data'); // presumes @types/node are installed
const foundUser = users.find(user => user.id === 42); 
// error: Parameter 'user' implicitly has an 'any' type.ts(7006)

Empfohlene Lösung: --resolveJsonModule

Der einfachste Weg für Ihren Fall ist die Verwendung der --resolveJsonModuleCompiler-Option:
import users from "./data.json" // `import` instead of `require`
const foundUser = users.find(user => user.id === 42); // user is strongly typed, no `any`!

Es gibt einige Alternativen für andere Fälle als den statischen JSON-Import.

Option 1: Expliziter Benutzertyp (einfach, keine Überprüfungen)

type User = { id: number; name: string /* and others */ }
const foundUser = users.find((user: User) => user.id === 42)

Option 2: Typwächter (Mittelgrund)

Typ Wachen sind ein guter Mittelgrund zwischen Einfachheit und starken Typen:
function isUserArray(maybeUserArr: any): maybeUserArr is Array<User> {
  return Array.isArray(maybeUserArr) && maybeUserArr.every(isUser)
}

function isUser(user: any): user is User {
  return "id" in user && "name" in user
}

if (isUserArray(users)) {
  const foundUser = users.find((user) => user.id === 42)
}
Sie können sogar zu Assertionsfunktionen (TS 3.7+) wechseln , um ifeinen Fehler zu beseitigen und stattdessen auszulösen .
function assertIsUserArray(maybeUserArr: any): asserts maybeUserArr is Array<User> {
  if(!isUserArray(maybeUserArr)) throw Error("wrong json type")
}

assertIsUserArray(users)
const foundUser = users.find((user) => user.id === 42) // works

Option 3: Systembibliothek vom Typ Laufzeit (anspruchsvoll)

Eine Laufzeit-Typprüfbibliothek wie io-tsoder ts-runtimekann für komplexere Fälle integriert werden.


Nicht empfohlene Lösungen

noImplicitAny: false untergräbt viele nützliche Überprüfungen des Typsystems:
function add(s1, s2) { // s1,s2 implicitely get `any` type
  return s1 * s2 // `any` type allows string multiplication and all sorts of types :(
}
add("foo", 42)

Geben Sie auch besser einen expliziten UserTyp für an user. Dadurch wird eine Ausbreitung anyauf innere Schichttypen vermieden. Stattdessen wird die Eingabe und Validierung im JSON-Verarbeitungscode der äußeren API-Schicht beibehalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.