ChatGPT解决这个技术问题 Extra ChatGPT

打字稿:TS7006:参数“xxx”隐式具有“任何”类型

在测试我的 UserRouter 时,我使用的是 json 文件

数据.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.

用户路由器.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;
你能告诉我们你的tsconfig吗?从外观上看,您已启用 noImplicitAny,这就是导致错误的原因。
所有这些建议您禁用 strictnoImplicitAny 的评论和答案都很糟糕。您不妨使用 JavaScript。

N
Nathaniel Ford

您正在使用 --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');
//...

在你的 tsconfig.json 添加这个 "noImplicitAny": false 到 "compilerOptions":{} 它会起作用
@naval-kishor-jha,但是 noImplicitAny 是一个不错的选择,我们必须找到一个 noImplicitAny 为 true 的解决方案,这是 Typescript 问题吗?
有时,我遇到这个问题,然后我在 StackOverflow 上快速搜索,我看到了我给你的投票,每次我都为这个问题生气 :) 我希望如此,我永远不会看到这个页面
在不了解这样做的含义的情况下禁用 noImplicitAny 是一个错误的决定,不应该在没有额外解释的情况下推荐它。仅当您从类型松散的代码库迁移并作为短期措施时,才应禁用它。禁用它会减少编译器错误,但其中一些暗示了代码中的实际错误;这些错误仍然存在,但现在不可见。请考虑 noImplicitAny: true 并不意味着您不能使用 any。这意味着您必须考虑周到。输入 : any 只需几分钟。
如果您将导入更改为 import 而不是 require,Typescript 将推断 JSON 对象的类型,就像您内联定义它一样。您不会有隐式的 any,也不必定义任何您盲目希望与 JSON 对象的形状匹配的特殊接口。这很好。这可能是 Typescript 的最新添加,我不知道它是什么时候开始这样做的。
s
st_ahmed

在您的 tsconfig.json 文件中,设置 compilerOptions 下的参数 "noImplicitAny": false 以消除此错误。


小心。此解决方法可以消除错误并仅修复症状;它不能解决根本原因。
@jbmusso 是对的。尝试使用严格模式而不是关闭它。这样你就不会在运行时发现错误
P
Penny Liu

在您的 tsconfig.json 文件的 compilerOptions 部分中进行这些更改,这对我有用

"noImplicitAny": false

无需设置

"strict":false

请等待 1 或 2 分钟 编译速度很慢 有些电脑


这个解决方案关闭了 TypeScript 的一个主要好处,即类型检查。我认为应该避免这种解决方案。
应用此解决方案意味着打字稿的死亡。躲开它。
S
Sunali Bandara

如果您收到错误,因为参数“元素”在 vueJs 中隐含了“任何”类型。Vetur(7006)

出现错误:

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

您可以通过将 thes 变量定义如下来修复它。

更正的代码:

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

这正是我需要的,谢谢。 ForEach 的“元素”需要用括号括起来,然后才能为其分配类型。即.forEach((元素:对象)...
S
Sven Eberth

我在 Angular 中发现了函数参数的这个问题。

在我的代码给出错误之前

参数“事件”隐式具有“任何”类型

这是代码

changeInpValue(event)
{
    this.inp = event.target.value;
}

这是更改,在参数写入 : any 并解决错误之后

changeInpValue(event : any)
{
    this.inp = event.target.value;
}

对我来说工作得很好。


J
Jeff Eastman

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


将严格模式设置为 false 非常糟糕。您不会再在编译时收到错误,但您会在运行时收到它们,这是您不想要的。我强烈建议将严格模式设置为 true
C
Community

最小的错误重现

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:类型保护(中间)

类型保护

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)
}

断言函数

如果

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-tsts-runtime 这样的运行时类型检查库。

不推荐的解决方案

noImplicitAny: 假

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 传播到内层类型。相反,键入和验证保存在外部 API 层的 JSON 处理代码中。


S
Sonika M K

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


C
Chandan

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


M
Muhammad Abubakar Zorrain

尝试声明用户的类型。如

let user:Object = {sample object}

按照这个方法。作为

let var:type = val

Á
ÁGUA-ROSADA

在您的 tsconfig.json 文件中添加以下规则:- "strict": false /* does not allow all strict type-checking options. */,