Typescript: TS7006: Parametr „xxx” ma niejawnie typ „any”


164

Podczas testowania mojego UserRoutera używam pliku JSON

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"
    ]
  },
  {
  ...
  }
]

Podczas tworzenia mojej aplikacji pojawia się następujący błąd TS

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;

5
Czy możesz nam pokazać swoje tsconfig? Wygląda na to, że noImplicitAnywłączyłeś i to jest przyczyną błędu.
Sebastian Sebald

1
Proszę odnieść się do tego parametru niejawnie ma typ
``

Odpowiedzi:


235

Używasz, --noImplicitAnya TypeScript nie wie o typie Usersobiektu. W takim przypadku musisz jawnie zdefiniować usertyp.

Zmień tę linię:

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

do tego:

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

Lub zdefiniuj typ swojego Usersobiektu:

//...
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');
//...

30
W twoim tsconfig.json dodaj to "noImplicitAny": false do "compilerOptions": {} to zadziała
Naval Kishor Jha

8
@ naval-kishor-jha, ale noImplicitAny jest dobrą opcją, musimy znaleźć rozwiązanie z wartością noImplicitAny jako prawdziwą, czy to problem z maszynopisem?
AhammadaliPK

2
Czasami napotykam ten problem i szybko wyszukuję na StackOverflow, widzę swój głos na Ciebie, za każdym razem, gdy jestem zły na siebie za ten problem :) Mam nadzieję, że nigdy nie zobaczę tej strony
Metin Atalay

64

W swoim tsconfig.jsonpliku ustaw parametr "noImplicitAny": falsepod, compilerOptionsaby pozbyć się tego błędu.


35
Ostrożny. To obejście wycisza błąd i tylko naprawia symptom; nie naprawia głównej przyczyny.
jbmusso

3
@jbmusso ma rację. Spróbuj użyć trybu ścisłego zamiast go wyłączać. W ten sposób nie znajdziesz błędów w czasie wykonywania
Ionel Lupu,

7

jeśli pojawi się błąd, ponieważ parametr 'element' ma niejawnie typ 'dowolny'. Vetur (7006) w vueJs

z błędem:

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

można to naprawić, definiując te zmienne w następujący sposób.

poprawiony kod:

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

Właśnie tego potrzebowałem, dzięki. „Element” ForEach musiał być otoczony nawiasami, zanim będzie mógł mieć przypisany typ. czyli .forEach ((element: obiekt) ...
CodeThief

6

Bardzo uporządkowany krój i skuteczne rozwiązanie: -

Dodaj poniższą regułę w pliku tsconfig.json: -

"noImplicitAny": false

Następnie zrestartuj projekt.


4

Napotkałem ten błąd i stwierdziłem, że jest to spowodowane ustawieniem parametru „ścisłe” na wartość true w pliku tsconfig.json. Po prostu ustaw go na „fałsz” (oczywiście). W moim przypadku wygenerowałem plik tsconfig z wiersza polecenia cmd i po prostu przeoczyłem parametr „ścisły”, który znajdował się w dalszej części pliku.


9
Ustawienie trybu ścisłego na fałsz jest bardzo złe. Nie będziesz już otrzymywać błędów w czasie kompilacji, ale otrzymasz je w czasie wykonywania, czego nie chcesz. Bardzo polecam ustawienie trybu ścisłego natrue
Ionel Lupu,

0

Minimalna reprodukcja błędów

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)

Zalecane rozwiązanie: --resolveJsonModule

Najprostszym sposobem w Twoim przypadku jest użycie --resolveJsonModuleopcji kompilatora:
import users from "./data.json" // `import` instead of `require`
const foundUser = users.find(user => user.id === 42); // user is strongly typed, no `any`!

Istnieje kilka alternatyw dla innych przypadków niż statyczny import JSON.

Opcja 1: Jawny typ użytkownika (prosty, bez sprawdzania)

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

Opcja 2: Wpisz osłony (środkowe pole)

Osłony typów są dobrym polem pośrednim między prostotą a mocnymi typami:
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)
}
Możesz nawet przełączyć się na funkcje asercji (TS 3.7+), aby pozbyć się ifi zamiast tego zgłosić błąd.
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

Opcja 3: Biblioteka systemowa typu Runtime (zaawansowana)

Biblioteka kontroli typu środowiska uruchomieniowego, taka jak io-tslub ts-runtimemoże być zintegrowana dla bardziej złożonych przypadków.


Niezalecane rozwiązania

noImplicitAny: false podważa wiele przydatnych kontroli systemu typów:
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)

Lepiej też podaj jawny Usertyp dla user. Pozwoli to uniknąć propagacji anydo typów warstw wewnętrznych. Zamiast tego wpisywanie i sprawdzanie poprawności jest przechowywane w kodzie przetwarzania JSON zewnętrznej warstwy API.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.