prosource

타이프스크립트:TS7006: 파라미터 'xx'에는 암묵적으로 '임의' 유형이 있습니다.

probook 2023. 2. 27. 22:28
반응형

타이프스크립트:TS7006: 파라미터 'xx'에는 암묵적으로 '임의' 유형이 있습니다.

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는 그 타입에 대해 알지 못합니다.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.jsonfile 파라미터 설정"noImplicitAny": false아래compilerOptions이 에러를 없애겠습니다.

에서 다음 변경을 실시합니다.compilerOptions의 단면tsconfig.json이것은 나에게 효과가 있었다.

"noImplicitAny": false

설정할 필요가 없음

"strict":false

그리고 컴파일이 너무 느리니까 1~2분만 기다려주세요.

파라미터 'element'암묵적으로 'any' 타입이 있어 에러가 발생하는 경우.vueJs의 Vetur(7006)

다음 오류와 함께:

 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");

Angular to function arguments에서 이 문제를 발견했습니다.

내 코드 오류 발생 전

매개 변수 'event'에 암시적으로 '임의' 유형이 있습니다.

여기 코드가 있습니다.

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

여기 변경 사항이 있습니다. 인수 작성 후: any그러면 오류가 해결됩니다.

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

난 잘 지내고 있어.

이 오류는 tsconfig.json 파일에서 "strict" 파라미터가 true로 설정되어 있기 때문에 발생합니다.그냥 "거짓"으로 설정하세요(분명히.제 경우 cmd 프롬프트에서 tsconfig 파일을 생성했는데 파일 아래쪽에 있는 "strict" 파라미터를 놓쳤을 뿐입니다.

최소한의 오류 재현

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

The simplest way for your case is to use --resolveJsonModule compiler option:
import users from "./data.json" // `import` instead of `require`
const foundUser = users.find(user => user.id === 42); // user is strongly typed, no `any`!

스태틱 JSON Import 이외의 다른 케이스도 있습니다.

옵션 1: 명시적 사용자 유형(심플, 체크 없음)

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

옵션 2: 타입 가드(중간)

타입 가드 are a good middleground between simplicity and strong types:
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)
}
You can even switch to 어설션 함수 (TS 3.7+) to get rid of if and throw an error instead.
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: 런타임 타입의 시스템 라이브러리(고급)

런타임 타입 체크라이브러리와 같은, 또는 보다 복잡한 케이스에 대해서 통합할 수 있습니다.


권장되지 않는 솔루션

noImplicitAny: false undermines many useful checks of the type system:
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 처리 코드에 입력 및 검증이 유지됩니다.

tsconfig.json으로 이동하여 //comments:true 이것은 나에게 효과가 있었다.

파라미터 'post'는 Angularcli에 암묵적으로 'any' 타입이 있습니다.프로젝트 작성 시 앱에서 Angular의 엄밀한 모드를 유효하게 했을 가능성이 있습니까?Max는 strict 모드를 비활성화할 것을 권장합니다. strict 모드를 활성화한 경우 tsconfig.json의 strict 속성을 false로 설정하여 이 과정에 대해 비활성화하십시오.

사용자 유형을 선언하려고 합니다.예를 들어

let user:Object = {sample object}

이 메티드를 따라가.~하듯이

let var:type = val

내 경우:


export default function ({user, path}) {
    return (
        //...
    )
}

로 바꿨습니다.

export default function ({user, path} : {
    user: string
    path: string
}) {
    return (
        //...
    )
}

파일에 tsconfig.json 。"strict": false /* does not allow all strict type-checking options. */,

더하면 돼요."checkJs": falsejsconfig.json

언급URL : https://stackoverflow.com/questions/43064221/typescript-ts7006-parameter-xxx-implicitly-has-an-any-type

반응형