Typescript: TS7006: Parameter '隐式有'any'类型

在测试我的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;
667792 次浏览

你正在使用--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中“strict”参数被设置为true。json文件。设置为“false”(显然)。在我的例子中,我从cmd提示符中生成了tsconfig文件,只是错过了“strict”参数,该参数位于文件的更下方。

在你的tsconfig.json文件中,在compilerOptions下设置参数"noImplicitAny": false来消除这个错误。

参数“element”隐式具有“any”类型。 在vueJs < / p >

错误为:

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

最小误差再现

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-tsts-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处理代码中。

转到tsconfig。Json和注释行//strict:true这对我有用

在你的tsconfig中添加以下规则。json文件: "strict": false /* does not allow all strict type-checking options. */, < / p >

参数'post'隐含有一个'any'类型在Angularcli 也许在项目创建时,你已经在应用中启用了Angular的严格模式? Max建议禁用严格模式 如果你已经启用了严格模式,请在本课程中通过在tsconfig中设置strict属性禁用它。

. json

在你的tsconfig.json文件的compilerOptions部分做这些改变,这对我有用

"noImplicitAny": false

无需设置

"strict":false

有些电脑编译很慢,请等1 - 2分钟

我在Angular的函数参数中发现了这个问题。

在我的代码给出错误之前

参数'event'隐含有一个'any'类型

这是代码

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

下面是修改,在参数写入: any之后,错误就解决了

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

对我来说很好。

尝试声明用户类型 如< / p >

let user:Object = {sample object}

遵循此方法。 < / p >

let var:type = val

只需将"checkJs": false添加到jsconfig.json文件中

我的情况:


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

我改成了

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