Typescript: TS7006: 'xxx' parametresi örtük olarak 'herhangi' bir türe sahip


145

UserRouter'ımı test ederken bir json dosyası kullanıyorum

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

Uygulamamı oluştururken aşağıdaki TS hatasını alıyorum

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
Bize gösterir tsconfigmisin Görünüşe göre noImplicitAnyetkinleştirdiniz ve hataya neden olan budur.
Sebastian Sebald

Yanıtlar:


212

Kullanıyorsunuz --noImplicitAnyve typescript türü hakkında bilmiyorum Usersnesne. Bu durumda, usertürü açıkça tanımlamanız gerekir .

bu satırı değiştirin:

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

bunun için:

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

Veya Usersnesnenizin türünü tanımlayı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');
//...

26
Tsconfig.json dosyanıza bu "noImplicitAny" öğesini ekleyin: "compilerOptions" için false: {} çalışacak
Naval Kishor Jha

7
@ naval-kishor-jha, ancak noImplicitAny iyi bir seçenek, noImplicitAny ile bir çözüm bulmalıyız, bu bir Typescript sorunu mu?
AhammadaliPK

1
Bazen bu problemle karşılaşıyorum sonra StackOverflow'da hızlıca arama yapıyorum, size oyumu görüyorum, bu sorundan dolayı kendime her kızdığımda :) Umarım bu sayfayı hiç görmeyeceğim
Metin Atalay

55

Sizin de tsconfig.jsondosyaya parametresini ayarlayın "noImplicitAny": falsealtında compilerOptionsbu hatanın kurtulmak için.


32
Dikkatli. Bu geçici çözüm, hatayı susturur ve yalnızca belirtiyi düzeltir; temel nedeni çözmez.
jbmusso

3
@jbmusso doğru. Kapatmak yerine katı modu kullanmayı deneyin. Bu şekilde çalışma zamanında hataları bulamazsınız
Ionel Lupu

5

Bu hatayla karşılaştım ve bunun nedeninin tsconfig.json dosyasında "sıkı" parametresinin true olarak ayarlandığını buldum. Sadece "yanlış" olarak ayarlayın (belli ki). Benim durumumda, tsconfig dosyasını cmd komut isteminden oluşturdum ve dosyanın daha aşağısında bulunan "sıkı" parametresini kaçırdım.


4
Katı modu yanlış olarak ayarlamak çok kötü. Artık derleme zamanında hata almayacaksınız, ancak bunları istemediğiniz çalışma zamanında alacaksınız. Sıkı modu şu şekilde ayarlamanızı şiddetle tavsiye ederimtrue
Ionel Lupu

5

Eğer gibi bir hata alırsanız Parametre 'eleman' örtülü bir 'herhangi' type.Vetur (7006) vardır içinde vueJs

hata ile:

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

Aşağıdaki gibi değişkenleri tanımlayarak düzeltebilirsiniz.

düzeltilmiş kod:

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

Bu tam olarak ihtiyacım olan şeydi, teşekkürler. ForEach'in "öğesi", kendisine atanan bir türe sahip olmadan önce parantez içinde çevrelenmelidir. yani .forEach ((element: nesne) ...
CodeThief

3

Çok nazik ve etkili çözüm aşağıdadır: -

Tsconfig.json dosyanıza aşağıdaki kuralı ekleyin: -

"noImplicitAny": false

Ardından projenizi yeniden başlatın.


0

Minimum hata üretimi

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)

Önerilen çözüm: --resolveJsonModule

Vakanızın en basit yolu, --resolveJsonModulederleyici seçeneğini kullanmaktır :
import users from "./data.json" // `import` instead of `require`
const foundUser = users.find(user => user.id === 42); // user is strongly typed, no `any`!

Statik JSON içe aktarma dışında başka durumlar için bazı alternatifler vardır.

1. Seçenek: Açık kullanıcı türü (basit, kontrol yok)

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

Seçenek 2: Tip korumaları (orta alan)

Yazı korumaları , basitlik ve güçlü türler arasında iyi bir orta yoldur:
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)
}
Kurtulmak ve bunun yerine bir hata atmak için onaylama işlevlerine (TS 3.7+) bile geçebilirsiniz 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

Seçenek 3: Çalışma zamanı türü sistem kitaplığı (gelişmiş)

Daha karmaşık durumlar için bir çalışma zamanı türü kontrol kitaplığı gibi io-tsveya ts-runtimeentegre edilebilir.


Önerilmeyen çözümler

noImplicitAny: false tür sisteminin birçok yararlı denetimini zayıflatır:
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)

Ayrıca için açık bir Usertür sağlamak daha iyidir user. Bu, anyiç katman türlerine yayılmasını önleyecektir . Bunun yerine yazma ve doğrulama, dış API katmanının JSON işleme kodunda tutulur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.