92 typescript
在测试我的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"
]
},
{
...
}
]
Run Code Online (Sandbox Code Playgroud)
构建我的应用程序,我得到以下TS错误
ERROR in ...../UserRouter.ts
(30,27): error TS7006: Parameter 'user' implicitly has an 'any' type.
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
Diu*_*lei 139
您正在使用--noImplicitAny和TypeScript不了解Users对象的类型.在这种情况下,您需要明确定义user类型.
改变这一行:
let user = Users.find(user => user.id === query);
Run Code Online (Sandbox Code Playgroud)
为了这:
let user = Users.find((user: any) => user.id === query);
// use "any" or someother interface to type this argument
Run Code Online (Sandbox Code Playgroud)
或者定义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');
//...
Run Code Online (Sandbox Code Playgroud)
小智 51
在对我有用的文件compilerOptions部分中进行这些更改tsconfig.json
"noImplicitAny": false
Run Code Online (Sandbox Code Playgroud)
无需设置
"strict":false
Run Code Online (Sandbox Code Playgroud)
请稍等一两分钟,有些电脑编译速度很慢
小智 37
在您的tsconfig.json文件中设置参数"noImplicitAny": false,compilerOptions以消除此错误.
小智 21
我在 Angular to argument of function 中发现了这个问题。
在我的代码出现错误之前
参数“event”隐式具有“any”类型
这是代码
changeInpValue(event)
{
this.inp = event.target.value;
}
Run Code Online (Sandbox Code Playgroud)
: any这是在参数 write和错误解决后的更改
changeInpValue(event : any)
{
this.inp = event.target.value;
}
Run Code Online (Sandbox Code Playgroud)
对我来说工作得很好。
小智 10
如果你得到一个错误,因为参数 'element' 在 vueJs 中隐式有一个 'any' type.Vetur(7006)
有错误:
exportColumns.forEach(element=> {
if (element.command !== undefined) {
let d = element.command.findIndex(x => x.name === "destroy");
Run Code Online (Sandbox Code Playgroud)
您可以通过如下定义 thoes 变量来修复它。
更正的代码:
exportColumns.forEach((element: any) => {
if (element.command !== undefined) {
let d = element.command.findIndex((x: any) => x.name === "destroy");
Run Code Online (Sandbox Code Playgroud)
小智 7
我输入了这个错误,发现这是因为tsconfig.json文件中的"strict"参数设置为true.只需将其设置为"假"(显然).在我的情况下,我从cmd提示符生成了tsconfig文件,只是错过了"strict"参数,该参数位于文件的下方.
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)
Run Code Online (Sandbox Code Playgroud)
--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`!
Run Code Online (Sandbox Code Playgroud)
对于静态 JSON 导入之外的其他情况,还有一些替代方案。
type User = { id: number; name: string /* and others */ }
const foundUser = users.find((user: User) => user.id === 42)
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
您甚至可以切换到断言函数(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
Run Code Online (Sandbox Code Playgroud)
对于更复杂的情况,可以集成类似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)
Run Code Online (Sandbox Code Playgroud)
还最好User为 提供显式类型user。这将避免传播any到内层类型。相反,类型和验证保留在外部 API 层的 JSON 处理代码中。
| 归档时间: |
|
| 查看次数: |
113034 次 |
| 最近记录: |