打字稿:TS7006:参数' xxx'隐含地有一个“任何”的类型

时间:2017-03-28 08:20:02

标签: 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"
    ]
  },
  {
  ...
  }
]

构建我的应用程序,我收到以下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;

13 个答案:

答案 0 :(得分:93)

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

答案 1 :(得分:24)

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

答案 2 :(得分:8)

我列出了这个错误,发现这是因为&#34; strict&#34;参数在tsconfig.json文件中设置为true。只需设置它&#34; false&#34; (明显)。在我的情况下,我从cmd提示符生成了tsconfig文件,只是错过了&#34; strict&#34;参数,位于文件的下方。

答案 3 :(得分:7)

如果出现错误,因为参数'element'隐式为'any'类型。Vetur(7006) vueJs

出现错误:

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

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

更正的代码:

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

答案 4 :(得分:7)

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

在您的tsconfig.json文件中添加以下规则:-

"noImplicitAny": false

然后重新启动您的项目。

答案 5 :(得分:1)

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

在我的代码出错之前

<块引用>

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

这里是代码

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

这里是变化,在参数写入 : any 后,错误解决

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

对我来说很好。

答案 6 :(得分:0)

此代码显示错误

video => { return { id: video.id, title: video.snippet.title, thumbnail: video.snippet.thumbnails.medium.url } });

但这解决了我的问题

(video: any) => { return { id: video.id, title: video.snippet.title, thumbnail: video.snippet.thumbnails.medium.url } });

答案 7 :(得分: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:键入卫兵(中间地带)

Type guards是简单和强类型之间的良好中间地带:
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)
}
您甚至可以切换到assertion functions(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-tsts-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传播到内层类型。而是将输入和验证保留在外部API层的JSON处理代码中。

答案 8 :(得分:0)

转到tsconfig.json并在// strict:true这行注释了这一行

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

来为本课程禁用它

答案 11 :(得分:0)

    "noImplicitAny": false
    

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

无需设置

    "strict":false

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

答案 12 :(得分:-1)

这对我有用。检查我如何使用 x 变量

 From

     const user = users.find(x => x.username === username && x.password === password);

   To
const user = users.find((x:any) => x.username === username && x.password === password);