打字稿:TS7006:参数'xxx'隐式具有'任意'类型

92 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,
      "in": 3
    },
    "hair": "bald",
    "eyes": "brown",
    "powers": [
      "strength",
      "durability",
      "healing"
    ]
  },
  {
  ...
  }
]
Run Code Online (Sandbox Code Playgroud)

构建我的应用程序,我得到以下TS错误

ERROR in ...../UserRouter.ts
(30,27): error TS7006: Parameter 'user' implicitly has an 'any' type.
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

Diu*_*lei 139

您正在使用--noImplicitAny和TypeScript不了解Users对象的类型.在这种情况下,您需要明确定义user类型.

改变这一行:

let user = Users.find(user => user.id === query);
Run Code Online (Sandbox Code Playgroud)

为了这:

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

或者定义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');
//...
Run Code Online (Sandbox Code Playgroud)

  • 在不了解这样做的含义的情况下禁用“noImplicitAny”是一个错误的决定,在没有额外解释的情况下不应建议这样做。仅当您从类型松散的代码库迁移并作为短期措施时,才应禁用它。禁用它会减少编译器错误,但其中一些错误暗示了代码中的实际错误;这些错误仍然存​​在,但现在不可见。请考虑“noImplicitAny: true”并不意味着您不能使用“any”。这意味着你必须深思熟虑地去做。只需几分钟即可输入“:any”。 (16认同)
  • 在你的tsconfig.json中将"noImplicitAny":false添加到"compilerOptions":{}它将起作用 (12认同)
  • @ naval-kishor-jha,但noImplicitAny是一个不错的选择,我们必须找到一个noImplicitAny为true的解决方案,是一个Typescript问题吗? (7认同)
  • 有时,我遇到这个问题,然后我很快在 StackOverflow 上搜索,我看到我投给你的票,每次我因为这个问题而生自己的气:) 我希望如此,我永远不会看到这个页面 (3认同)

小智 51

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

"noImplicitAny": false
Run Code Online (Sandbox Code Playgroud)

无需设置

"strict":false
Run Code Online (Sandbox Code Playgroud)

请稍等一两分钟,有些电脑编译速度很慢

  • 这个解决方案关闭了 TypeScript 的一个主要优点,即类型检查。我认为应该避免这种解决方案。 (21认同)
  • 应用这个解决方案意味着打字稿的死亡。躲开它。 (4认同)

小智 37

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

  • 小心。此解决方法使错误消失,仅修复症状。它不能解决根本原因。 (12认同)
  • @jbmusso是正确的。尝试使用严格模式而不是将其关闭。这样您就不会在运行时发现错误 (2认同)

小智 21

我在 Angular to argument of function 中发现了这个问题。

在我的代码出现错误之前

参数“event”隐式具有“any”类型

这是代码

changeInpValue(event)
{
    this.inp = event.target.value;
}
Run Code Online (Sandbox Code Playgroud)

: any这是在参数 write和错误解决后的更改

changeInpValue(event : any)
{
    this.inp = event.target.value;
}
Run Code Online (Sandbox Code Playgroud)

对我来说工作得很好。


小智 10

如果你得到一个错误,因为参数 'element'vueJs 中隐式有一个 'any' type.Vetur(7006)

有错误:

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

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

更正的代码:

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


小智 7

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

  • 将严格模式设置为false是非常糟糕的。您不会再在编译时遇到错误,但是会在运行时获取它们,您不需要这些错误。我强烈建议将严格模式设置为“ true” (3认同)

for*_*d04 6

最小错误再现

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)
Run Code Online (Sandbox Code Playgroud)

推荐解决方案:--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`!
Run Code Online (Sandbox Code Playgroud)

对于静态 JSON 导入之外的其他情况,还有一些替代方案。

选项 1:显式用户类型(简单,无检查)

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

选项 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)
}
Run Code Online (Sandbox Code Playgroud) 您甚至可以切换到断言函数(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
Run Code Online (Sandbox Code Playgroud)

选项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)
Run Code Online (Sandbox Code Playgroud)

还最好User为 提供显式类型user。这将避免传播any到内层类型。相反,类型和验证保留在外部 API 层的 JSON 处理代码中。


小智 5

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