Машинопись: TS7006: параметр 'xxx' неявно имеет тип 'any'


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

Ответы:


212

Вы используете, --noImplicitAnyа TypeScript не знает о типе Usersобъекта. В этом случае вам необходимо явно указать userтип.

Измените эту строку:

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

к этому:

let user = Users.find((user: any) => user.id === query); 
// use "any" or some other 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 как true, это проблема с Typescript?
— AhammadaliPK

1
Иногда я сталкиваюсь с этой проблемой, и я быстро ищу в StackOverflow, я вижу свой голос за вас, каждый раз, когда я злюсь на себя из-за этой проблемы :) Надеюсь, что да, я никогда не увижу эту страницу
— Метин Аталай,

56

В вашем tsconfig.jsonфайле установить параметр "noImplicitAny": falseпод compilerOptionsизбавиться от этой ошибки.


32
Осторожный. Этот обходной путь заглушает ошибку и устраняет только симптом; это не устраняет основную причину.
— jbmusso

3
@jbmusso прав. Попробуйте использовать строгий режим вместо его выключения. Таким образом, вы не найдете ошибок во время выполнения
— Ионел Лупу

5

Я заключил эту ошибку и обнаружил, что это произошло из-за того, что параметр "strict" был установлен в значение true в файле tsconfig.json. Просто установите "false" (очевидно). В моем случае я сгенерировал файл tsconfig из командной строки и просто пропустил параметр «strict», который находился ниже в файле.


4
Установка строгого режима на false - это очень плохо. У вас больше не будет ошибок во время компиляции, но вы получите их во время выполнения, чего вы не хотите. Я настоятельно рекомендую установить строгий режим наtrue
— Ионел Лупу

5

если вы получаете сообщение об ошибке, поскольку параметр 'element' неявно имеет тип 'any'. 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 ((element: object) ...
— CodeThief

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.