在测试我的 UserRouter 时,我使用的是 json 文件
数据.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.
用户路由器.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;
tsconfig
吗?从外观上看,您已启用 noImplicitAny
,这就是导致错误的原因。
strict
或 noImplicitAny
的评论和答案都很糟糕。您不妨使用 JavaScript。
您正在使用 --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.json
文件中,设置 compilerOptions
下的参数 "noImplicitAny": false
以消除此错误。
在您的 tsconfig.json
文件的 compilerOptions
部分中进行这些更改,这对我有用
"noImplicitAny": false
无需设置
"strict":false
请等待 1 或 2 分钟 编译速度很慢 有些电脑
如果您收到错误,因为参数“元素”在 vueJs 中隐含了“任何”类型。Vetur(7006)
出现错误:
exportColumns.forEach(element=> {
if (element.command !== undefined) {
let d = element.command.findIndex(x => x.name === "destroy");
您可以通过将 thes 变量定义如下来修复它。
更正的代码:
exportColumns.forEach((element: any) => {
if (element.command !== undefined) {
let d = element.command.findIndex((x: any) => x.name === "destroy");
我在 Angular 中发现了函数参数的这个问题。
在我的代码给出错误之前
参数“事件”隐式具有“任何”类型
这是代码
changeInpValue(event)
{
this.inp = event.target.value;
}
这是更改,在参数写入 : any
并解决错误之后
changeInpValue(event : any)
{
this.inp = event.target.value;
}
对我来说工作得很好。
遇到这个错误,发现是因为tsconfig.json文件中“strict”参数设置为true。只需将其设置为“假”(显然)。在我的情况下,我从 cmd 提示符生成了 tsconfig 文件,只是错过了位于文件更下方的“严格”参数。
true
最小的错误重现
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)
}
断言函数
如果
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: 假
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 这对我有用
参数“post”在 Angularcli 中隐式具有“any”类型 也许在创建项目时,您在应用程序中启用了 Angular 的严格模式? Max 建议禁用严格模式如果您启用了严格模式,请通过将 tsconfig.json 中的 strict 属性设置为 false 来禁用此课程
尝试声明用户的类型。如
let user:Object = {sample object}
按照这个方法。作为
let var:type = val
在您的 tsconfig.json 文件中添加以下规则:- "strict": false /* does not allow all strict type-checking options. */,
不定期副业成功案例分享
noImplicitAny
是一个错误的决定,不应该在没有额外解释的情况下推荐它。仅当您从类型松散的代码库迁移并作为短期措施时,才应禁用它。禁用它会减少编译器错误,但其中一些暗示了代码中的实际错误;这些错误仍然存在,但现在不可见。请考虑noImplicitAny: true
并不意味着您不能使用any
。这意味着您必须考虑周到。输入: any
只需几分钟。import
而不是require
,Typescript 将推断 JSON 对象的类型,就像您内联定义它一样。您不会有隐式的any
,也不必定义任何您盲目希望与 JSON 对象的形状匹配的特殊接口。这很好。这可能是 Typescript 的最新添加,我不知道它是什么时候开始这样做的。