Bản thảo: TS7006: Tham số 'xxx' hoàn toàn có loại 'bất kỳ'


143

Khi kiểm tra UserRouter của tôi, tôi đang sử dụng tệp 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"
    ]
  },
  {
  ...
  }
]

Xây dựng ứng dụng của tôi, tôi nhận được lỗi TS sau

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
Bạn có thể chỉ cho chúng tôi tsconfig? Bởi vẻ ngoài của nó, bạn đã noImplicitAnykích hoạt và đó là nguyên nhân gây ra lỗi.
Sebastian Sebald

1
Vui lòng tham khảo thông số
Mohammad Ayoub Khan

Câu trả lời:


208

Bạn đang sử dụng --noImplicitAnyvà TypeScript không biết về loại Usersđối tượng. Trong trường hợp này, bạn cần xác định rõ ràng userloại.

thay đổi dòng này:

let user = Users.find(user => user.id === query);

cho điều này:

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

Hoặc xác định loại Usersđối tượng của bạn :

//...
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
Trong tsconfig.json của bạn, hãy thêm "noImplicitAny": false vào "Trình biên dịch": {} nó sẽ hoạt động
Hải quân Kishor Jha

7
@ naval-kishor-jha, nhưng noImplicitAny là một lựa chọn tốt, chúng ta phải tìm một giải pháp với noImplicitAny là đúng, đó có phải là vấn đề về Bản in không?
AhammadaliPK

1
Đôi khi, tôi gặp phải vấn đề này sau đó tôi nhanh chóng tìm kiếm trên StackOverflow, tôi thấy phiếu bầu của tôi cho bạn, mỗi khi tôi giận chính mình vì vấn đề này :) Tôi hy vọng vậy, tôi sẽ không bao giờ thấy trang này
Metin Atalay

54

Trong tsconfig.jsontệp của bạn, đặt tham số "noImplicitAny": falsebên dưới compilerOptionsđể thoát khỏi lỗi này.


32
Cẩn thận. Cách giải quyết này làm im lặng lỗi và chỉ sửa chữa triệu chứng; nó không khắc phục được nguyên nhân gốc rễ.
jbmusso

3
@jbmusso nói đúng. Cố gắng sử dụng chế độ nghiêm ngặt thay vì tắt nó. Bằng cách này, bạn sẽ không tìm thấy lỗi trong thời gian chạy
Ionel Lupu

5

Tôi đã gặp lỗi này và thấy rằng đó là do tham số "nghiêm ngặt" được đặt thành đúng trong tệp tsconfig.json. Chỉ cần đặt nó là "sai" (rõ ràng). Trong trường hợp của tôi, tôi đã tạo tệp tsconfig từ dấu nhắc cmd và chỉ đơn giản là bỏ lỡ tham số "nghiêm ngặt", được đặt sâu hơn trong tệp.


4
Đặt chế độ nghiêm ngặt thành false là rất xấu. Bạn sẽ không gặp lỗi về thời gian biên dịch nữa nhưng bạn sẽ nhận được chúng trong thời gian chạy mà bạn không muốn. Tôi đặc biệt khuyên bạn nên cài đặt chế độ nghiêm ngặt thànhtrue
Ionel Lupu

5

nếu bạn gặp lỗi vì tham số 'phần tử' hoàn toàn có loại 'bất kỳ' .Vurur (7006) trong vueJs

với lỗi:

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

bạn có thể sửa nó bằng cách định nghĩa các biến như sau.

sửa mã:

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

Đây chính xác là những gì tôi cần, cảm ơn. 'Phần tử' của ForEach cần xung quanh trong ngoặc đơn trước khi nó có thể có một loại được gán cho nó. tức là .forEach ((phần tử: đối tượng) ...
CodeThief

3

Giải pháp cắt rất sắp xếp và hiệu quả là dưới đây: -

Thêm quy tắc dưới đây vào tệp tsconfig.json của bạn: -

"noImplicitAny": false

Sau đó khởi động lại dự án của bạn.


0

Tái tạo lỗi tối thiểu

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)

Giải pháp được đề nghị: --resolveJsonModule

Cách đơn giản nhất cho trường hợp của bạn là sử dụng --resolveJsonModuletùy chọn trình biên dịch:
import users from "./data.json" // `import` instead of `require`
const foundUser = users.find(user => user.id === 42); // user is strongly typed, no `any`!

Có một số lựa chọn thay thế cho các trường hợp khác ngoài nhập JSON tĩnh.

Tùy chọn 1: Loại người dùng rõ ràng (đơn giản, không cần kiểm tra)

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

Tùy chọn 2: Loại vệ sĩ (giữa sân)

Loại bảo vệ là một trung gian tốt giữa đơn giản và loại mạnh:
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)
}
Bạn thậm chí có thể chuyển sang các chức năng xác nhận (TS 3.7+) để loại bỏ ifvà thay vào đó là một lỗi.
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

Tùy chọn 3: Thư viện hệ thống kiểu thời gian chạy (tinh vi)

Một thư viện kiểm tra kiểu thời gian chạy như io-tshoặc ts-runtimecó thể được tích hợp cho các trường hợp phức tạp hơn.


Giải pháp không được đề xuất

noImplicitAny: false làm suy yếu nhiều kiểm tra hữu ích của hệ thống loại:
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)

Cũng tốt hơn cung cấp một Userloại rõ ràng cho user. Điều này sẽ tránh lan truyền anyđến các loại lớp bên trong. Thay vào đó, việc nhập và xác thực được giữ trong mã xử lý JSON của lớp API bên ngoài.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.