初学ts请问这个问题该怎么改
interface IBaseCURD<T> {
list:Array<T>
add:(t:T) => T
getUersId:(id:number) => T
}
// 定义一个用户信息的类
class User {
id?:number | string //id代表可有可无
name:string //用户的姓名
age:number //用户的年龄
constructor(name:string,age:number){
this.name = name;
this.age = age
}
}
//定义一个类,可以针对用户的信息对象进行增加及查询的操作
class UserCRUD implements IBaseCURD<User>{
//用来存多个User类型的用户信息对象
list:Array<User> =[]
add(user:User):User {
user.id =Date.now() +Math.random()
//将用户信息添加到data中
this.list.push(user)
return user
}
// 根据id查询用户信息
getUersId(id:number):User {
return this.list.find(item => item.id == id)
}
}
const userCURD = new UserCRUD();
userCURD.add(new User('jack',20))
const {id} = userCURD.add(new User('lance',16))
userCURD.add(new User('tom',18))
console.log(userCURD.list);
const user = userCURD.getUersId(id)
console.log(user);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
类型要兼容。getUserID定义返回值要是User;但是find是有可能找不到的,即find返回的类型含有undefined。同理此方法接受的参数是number,但是你的类型定义中User.id是可选的,也就是id的类型为number|string|undefined。初学还是好好看文档吧,断言可以解决问题,但是不建议
大兄弟,你这个id定义的时候
?:
是没问题的,因为如果是自增的话那么可以为undefined
,但是你这里为啥还要定义类型为number|string
呢?定义number
不就行了吗?我第一次见数据表一个字段会存在两种类型的。然后你
getUserId
这里面的参数又是number
类型,这不是给自己找不自在吗?那么你首先你定义数据结构的时候应该就是
id?: number
就行。然后查询的时候做个判断啊:不就行了吗?有啥好纠结的。
第一个错误,find 的返回的结果是User类型和undefined, 后续你也需要判断结果是否undefined,你可以给getUersId函数添加多一个undefined 类型,
如果getUersId函数undefined时你有默认值,你也可以使用类型保护,类似这样
参考 typescript 文档中 高级类型 中的类型保护和类型断言
https://www.tslang.cn/docs/ha...
你还可以在tsconfig.json 将strictNullChecks设置成false(不建议)
第二个错误,
不知道你为什么设置id存在时为 number | string
如果你的id 存在时为number | string
getUsersId函数应该改成
getUsersId(id:number | string)
还要判断undefined
你可以使用 typeof类型保护 https://www.tslang.cn/docs/ha...
不习惯 严格检查 undefined 的话,建议在 tsconfig.json 中加入
用以取消严格检查
报错的问题,是因为 User 中的 id 是可选的,也就是
id: number | undefined
,所以下面在使用时,TS 推断那里的 id 可能不存在,所以提示错误