Typescript:TS7006:参数';xxx和x27;隐式具有';任何';类型

Typescript:TS7006:参数';xxx和x27;隐式具有';任何';类型,typescript,Typescript,在测试我的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,

在测试我的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;
您正在使用
--noImplicitAny
,TypeScript不知道
用户
对象的类型。在这种情况下,您需要显式定义
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
或者定义
用户
对象的类型:

//...
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');
//...
/。。。
界面用户{
id:编号;
名称:字符串;
别名:字符串[];
职业:字符串;
性别:弦;
高度:{ft:number;in:number;}
头发:细绳;
眼睛:线;
powers:string[]
}
//...
const Users=require(“../data”);
//...

我遇到了这个错误,发现这是因为tsconfig.json文件中的“strict”参数设置为true。只需将其设置为“false”(显然)。在我的例子中,我从cmd提示符生成了tsconfig文件,只是错过了位于文件更下方的“strict”参数。

tsconfig.json
文件中设置参数
“noImplicitAny”:false
编译器选项下,以消除此错误。

如果在参数'element'中出现错误,则隐式包含'any'类型。Vetur(7006)vueJs中

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;
错误如下:

您可以通过如下定义这些变量来修复它

更正代码:

最小误差再现 建议的解决方案:
--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:显式用户类型(简单,无检查) 选项2:类型防护装置(中间地面) 是简单型和强型之间的良好中间地带:
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)
}
选项3:运行时类型系统库(复杂) 运行时类型检查库(如or)可以集成用于更复杂的情况


不是建议的解决方案 破坏了类型系统的许多有用检查:
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)

另外,最好为
用户
提供一个显式的
用户
类型。这将避免将
any
传播到内层类型。相反,输入和验证保存在外部API层的JSON处理代码中。

非常有效的解决方案如下:-

"noImplicitAny": false
在tsconfig.json文件中添加以下规则:-

"noImplicitAny": false

然后重新启动您的项目。

转到tsconfig.json并对行注释//strict:true这对我有效

在tsconfig.json文件中添加以下规则:-
“strict”:false/*不允许所有严格类型检查选项。*/,

参数“post”在Angularcli中隐式具有“any”类型 也许在项目创建时,您已在应用程序中启用Angular的严格模式? Max建议禁用严格模式 如果您启用了严格模式,请将tsconfig.json中的strict属性设置为false

    "noImplicitAny": false
    
在tsconfig.json文件的compilerOptions部分进行这些更改这对我很有用

不需要设置

    "strict":false

请等待一两分钟,编译速度非常慢,一些PC将正常答案添加到tsconfig.json文件中 “非强制性”:错误,
然后解决这个问题

你能给我们看看你的
tsconfig
吗?从外观上看,您已经启用了
noImplicitAny
,这就是导致错误的原因。请在tsconfig.json中参考这一点,将此“noImplicitAny”:false添加到“compilerOptions”:{}它将work@naval-kishor jha,但是noImplicitAny是个不错的选择,我们必须找到一个解决方案,noImplicitAny是正确的,这是打字稿的问题吗?有时,我遇到这个问题,然后我快速搜索StackOverflow,我看到我投给你的票,每次我为这个问题对自己感到愤怒:)我希望如此,我永远不会看到这个页面。这种解决方法消除了错误,只修复了症状;它不能解决根本原因。@jbmuso是对的。尝试使用严格模式,而不是关闭它。这样您就不会在运行时发现错误。将strict mode设置为false是非常糟糕的。编译时不会再出现错误,但运行时会出现错误,这是您不希望看到的。我强烈建议将严格模式设置为
true
这正是我所需要的,谢谢。ForEach的“元素”需要在括号中括起来,然后才能为其指定类型。i、 e..forEach((元素:对象)…这似乎是一个答案。这个答案提供了与@st_ahmed两年前提出的完全相同的解决方案。
"noImplicitAny": false
    "noImplicitAny": false
    
    "strict":false