Typescript:TS7006:パラメータ 'xxx'は暗黙的に 'any'タイプを持っています


144

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と、有効になっており、それがエラーの原因です。
— Sebastian Sebald 2017年

回答:


210

--noImplicitAnyTypeScriptが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');
//...

25
tsconfig.jsonに次の「noImplicitAny」を追加します:falseを「compilerOptions」に追加します:{}機能します
— 海軍のキショールJha

7
@ naval-kishor-jha、しかしnoImplicitAnyは良いオプションです、私たちはnoImplicitAnyをtrueとして解決策を見つけなければなりません、それはTypescriptの問題ですか?
— AhammadaliPK 2018

1
時々、私はこの問題に遭遇し、すぐにStackOverflowで検索します。私がこの問題に夢中になるたびに、私はあなたへの投票を表示します:)私はそう思います、私はこのページを見ることはありません
— Metin Atalay

54

あなたにはtsconfig.json、ファイルのパラメータを設定"noImplicitAny": falseの下でcompilerOptions、このエラーを取り除くために。


32
注意してください。この回避策はエラーを抑制し、症状のみを修正します。根本的な原因は修正されません。
— jbmusso

3
@jbmussoは正しいです。シャットダウンする代わりに、strictモードを使用してみてください。これにより、実行時にエラーが見つかりません
— Ionel Lupu

5

このエラーに遭遇し、tsconfig.jsonファイルで「strict」パラメーターがtrueに設定されていたことが原因であることがわかりました。(明らかに) "false"に設定するだけです。私の場合、私はcmdconfigプロンプトからtsconfigファイルを生成し、ファイルのさらに下にある「strict」パラメーターを単に見落としました。


4
strictモードをfalseに設定することは非常に悪いことです。コンパイル時にエラーが発生することはなくなりますが、実行時にエラーが発生するため、望ましくありません。厳格モードを次のように設定することを強くお勧めしますtrue
— Ionel Lupu

5

あなたのようにエラーが発生した場合のパラメータ「要素」暗黙的に「は任意の」type.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の「要素」は、型を割り当てる前に括弧で囲む必要がありました。ie .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:タイプガード(中間)

タイプガードは、単純型と強力な型の中間に位置します。
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、内部レイヤータイプへの伝播が回避されます。代わりに、入力と検証は外部APIレイヤーのJSON処理コードに保持されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.