প্রকার: TS7006: প্যারামিটার 'এক্সএক্সএক্সএক্স' স্পষ্টভাবে একটি 'যেকোন' টাইপ রয়েছে


145

আমার ইউজারআরটার পরীক্ষায়, আমি একটি জেসন ফাইল ব্যবহার করছি

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

আমার অ্যাপ্লিকেশন তৈরি করে, আমি নিম্নলিখিত টিএস ত্রুটি পেয়েছি

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সক্ষম করেছেন এবং এটিই ত্রুটির কারণ ঘটায়।
— সেবাস্তিয়ান সেবল্ড

উত্তর:


211

আপনি ব্যবহার করছেন --noImplicitAnyএবং টাইপস্ক্রিপ্ট 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');
//...

26
আপনার tsconfig.json এ এই "noImpLiveAny" যুক্ত করুন: "সংকলক অপশন" -এর কাছে মিথ্যা: এটি কাজ করবে
— নেভাল কিশোর ঝা

7
@ নেভাল-কিশোর-ঝা, তবে কোনও ইম্পিলিক্টএই একটি ভাল বিকল্প নয়, আমাদের নো ইম্পিলিক্ট সহ একটি সমাধান খুঁজে বের করতে হবে, যে কোনও সত্য, এটি কি টাইপস্ক্রিপ্টের সমস্যা?
— আহমাদালিপিকে

1
কখনও কখনও, আমি এই সমস্যার মুখোমুখি হই তবে আমি দ্রুত স্ট্যাক ওভারফ্লোতে অনুসন্ধান করি, আমি আপনাকে আমার ভোট দেখতে পাচ্ছি, প্রতিবারই আমি এই সমস্যার জন্য নিজেকে উন্মাদ করছি :) আমি আশা করি, আমি এই পৃষ্ঠাটি কখনই দেখতে পাব না
— মেটিন আটল

55

আপনার tsconfig.jsonফাইল প্যারামিটার সেট "noImplicitAny": falseঅধীনে compilerOptionsএই ত্রুটি পরিত্রাণ পেতে।


32
সাবধান হন। এই কর্মশালা ত্রুটিটি নিঃশব্দ করে দেয় এবং কেবল লক্ষণটি স্থির করে; এটি মূল কারণটি ঠিক করে না।
— jbmusso

3
@jbmusso ঠিক আছে। বন্ধ করার পরিবর্তে কঠোর মোডটি ব্যবহার করার চেষ্টা করুন। এই সময় আপনি
— রানটাইমগুলিতে

5

আমি এই ত্রুটিটির মুখোমুখি হয়েছি এবং দেখেছি এটি ছিল কারণ tsconfig.json ফাইলটিতে "কঠোর" পরামিতিটি সত্য হয়ে গেছে। কেবল এটি "মিথ্যা" সেট করুন (স্পষ্টতই)। আমার ক্ষেত্রে আমি সিএমডি প্রম্পট থেকে tsconfig ফাইলটি তৈরি করেছি এবং কেবল "কড়া" পরামিতিটি মিস করেছি, যা ফাইলের আরও নিচে অবস্থিত।


4
কঠোর মোডে মিথ্যা সেট করা খুব খারাপ। সংকলনের সময় আপনি আর ত্রুটি পাবেন না তবে আপনি রানটাইম এগুলি পাবেন যা আপনি চান না। আমি কঠোর মোডটি সেট করার জন্য সুপারিশ করছিtrue
— আয়নেল লুপু

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

ধন্যবাদ এটি আমার প্রয়োজন ঠিক ছিল। এটির জন্য কোনও ধরণের নির্ধারিত হওয়ার আগে ফোরইচের 'এলিমেন্ট' বন্ধুত্বের আশেপাশে প্রয়োজন। যেমন .এফের জন্য ((উপাদান: অবজেক্ট) ...
— কোডটফ

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`!

স্থির জেএসওএন আমদানি ব্যতীত অন্যান্য ক্ষেত্রে কিছু বিকল্প রয়েছে।

বিকল্প 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)
}
এমনকি পরিত্রাণ পেতে এবং পরিবর্তে একটি ত্রুটি নিক্ষেপ করতে আপনি এমনকি দৃ functions ়তা ফাংশন (টিএস 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অভ্যন্তরীণ স্তরের ধরণের প্রচার এড়াবে । পরিবর্তে টাইপিং এবং যাচাইকরণ বাইরের এপিআই স্তরটির জেএসএন প্রসেসিং কোডে রাখা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.