Typescript: TS7006: Параметр 'xxx' неявно має тип 'будь-який'


145

Для тестування свого UserRouter я використовую файл 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"
    ]
  },
  {
  ...
  }
]

Створюючи додаток, я отримую таку помилку 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;

4
Чи можете ви показати нам своє tsconfig? Поглядом на це ви noImplicitAnyввімкнули, і саме це спричиняє помилку.
— Себастьян Себальд

1
Будь ласка, посилайтесь на цей параметр неявно має тип "будь-який"
— Mohammad Ayoub Khan

Відповіді:


211

Ви використовуєте --noImplicitAnyі TypeScript не знаєте про тип Usersоб'єкта. У цьому випадку потрібно чітко визначити userтип.

змінити цей рядок:

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

для цього:

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

Або визначте тип вашого Usersоб'єкта:

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

26
У свій tsconfig.json додайте це "noImplicitAny": false до "compilerOptions": {} це спрацює
— Naval Kishor Jha

7
@ naval-kishor-jha, але noImplicitAny - це хороший варіант, ми маємо знайти рішення з noImplicitAny як істинне, це проблема з Typescript?
— AhammadaliPK

1
Іноді я стикаюся з цією проблемою, тоді я швидко шукаю в StackOverflow, бачу свій голос за вас, кожен раз, коли я злий на себе за цю проблему :) Сподіваюсь, що я ніколи не побачу цю сторінку
— Metin Atalay

55

У вашому tsconfig.jsonфайлі встановіть параметр "noImplicitAny": falseнижче, compilerOptionsщоб позбутися цієї помилки.


32
Дбайливий. Таке вирішення замовчує помилку і лише виправляє симптом; вона не виправляє першопричину.
— jbmusso

3
@jbmusso має рацію. Спробуйте використовувати суворий режим, а не вимикати його. Таким чином, ви не знайдете помилок під час виконання
— Ionel Lupu

5

Я зіткнувся з цією помилкою і виявив, що це було через те, що в "tsconfig.json файл" було встановлено значення "строгий". Просто встановіть його "помилково" (очевидно). У моєму випадку я створив файл tsconfig із запиту cmd і просто пропустив "суворий" параметр, який знаходився далі у файлі.


4
Встановлення суворого режиму на хибне дуже погано. Ви більше не отримаєте помилок під час компіляції, але ви отримаєте їх під час виконання, чого ви не хочете. Я настійно рекомендую встановити суворий режим наtrue
— Ionel Lupu

5

якщо ви отримуєте помилку, так як параметр "елемент" неявно має тип "будь-який". Vetur (7006) у vueJs

з помилкою:

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

Ви можете виправити це, визначивши змінні тота, як і будь-яке наступне.

виправлений код:

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

Це саме те, що мені було потрібно, дякую. 'Елемент' ForEach потрібен оточенню в дужках, перш ніж він міг присвоїти йому тип. тобто .forEach ((елемент: об'єкт) ...
— CodeTentist

3

Внизу дуже ефективне вирізання та ефективне рішення: -

Додайте нижченаведене правило у свій файл tsconfig.json: -

"noImplicitAny": false

Потім перезавантажте проект.


0

Відтворення мінімальної помилки

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)

Рекомендоване рішення: --resolveJsonModule

Найпростіший спосіб для вашого випадку - використовувати --resolveJsonModuleваріант компілятора:
import users from "./data.json" // `import` instead of `require`
const foundUser = users.find(user => user.id === 42); // user is strongly typed, no `any`!

Існують деякі альтернативи для інших випадків, ніж статичний імпорт JSON.

Варіант 1: Явний тип користувача (простий, без перевірок)

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

Варіант 2: Тип захисників (середній рівень)

Тип охоронці хороший Middleground між простотою і сильними типами:
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)
}
Ви навіть можете переключитися на функції твердження (TS 3.7+), щоб позбутися ifі замість цього виправити помилку.
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

Варіант 3: Системна бібліотека типу виконання (складна)

Бібліотека перевірки типу виконання, яка подобається io-tsабо ts-runtimeможе бути інтегрована для більш складних випадків.


Не рекомендуються рішення

noImplicitAny: false підриває багато корисних перевірок типової системи:
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)

Також краще надати чіткий Userтип для user. Це дозволить уникнути поширення anyна внутрішні типи шарів. Натомість введення та перевірка зберігається в коді обробки JSON зовнішнього шару API.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.