Javascript 正确使用typescript泛型
我有一个如下格式的接口,它描述了如下数据库方法:Javascript 正确使用typescript泛型,javascript,node.js,typescript,Javascript,Node.js,Typescript,我有一个如下格式的接口,它描述了如下数据库方法: export default interface IRepository { createAndSave(data: ICreateUserDTO): Promise<User> findById<T>({ id }: { id: number }): Promise<T | null> // right here ... } 当我尝试创建这样的findById方法时,typescript给出了这
export default interface IRepository {
createAndSave(data: ICreateUserDTO): Promise<User>
findById<T>({ id }: { id: number }): Promise<T | null> // right here
...
}
当我尝试创建这样的findById
方法时,typescript给出了这种格式的错误
Type 'import("../src/user/infra/typeorm/entities/User").default' is not assignable to type 'User'.
'User' could be instantiated with an arbitrary type which could be unrelated to 'import("../src/audience/infra/typeorm/entities/User").default'
我试图使用typescript断言来覆盖这个错误,就像这样
class DatabaseOps {
private ormManager: Repository<User>
...
async findById<User>({ id }: { id: number }): Promise<User | null> {
const t = await this.ormManager.findOne({
where: { id },
})
return t as Promise<User> // here
}
...
}
这可能是什么原因,我该如何纠正?任何帮助都将不胜感激。多谢各位 IRepository.findById方法的类型签名与您认为的含义不同 当您编写
findById
时,这意味着该方法可以处理任何类型的T
。调用该方法的人选择该方法的类型。有点像这样:
const r : IRepository = ...
const x = r.findById<User>( ... )
const y = r.findById<number>( ... )
consy z = r.findById<string>( ... )
... and so on
然后您可以在类中实现IRepository
:
class UserRepository {
...
async createAndSave(data: ICreateUserDTO): Promise<User> {
...
}
async findById({ id }: { id: number }): Promise<User | null> {
const t = await this.ormManager.findOne({
where: { id },
})
return t as Promise<User> // here
}
...
}
类用户存储库{
...
异步createAndSave(数据:ICreateUserDTO):承诺{
...
}
异步findById({id}:{id:number}):承诺{
const t=wait this.ormManager.findOne({
其中:{id},
})
将t作为承诺返回//此处
}
...
}
IRepository.findById方法的类型签名并不代表您所认为的含义
当您编写findById
时,这意味着该方法可以处理任何类型的T
。调用该方法的人选择该方法的类型。有点像这样:
const r : IRepository = ...
const x = r.findById<User>( ... )
const y = r.findById<number>( ... )
consy z = r.findById<string>( ... )
... and so on
然后您可以在类中实现IRepository
:
class UserRepository {
...
async createAndSave(data: ICreateUserDTO): Promise<User> {
...
}
async findById({ id }: { id: number }): Promise<User | null> {
const t = await this.ormManager.findOne({
where: { id },
})
return t as Promise<User> // here
}
...
}
类用户存储库{
...
异步createAndSave(数据:ICreateUserDTO):承诺{
...
}
异步findById({id}:{id:number}):承诺{
const t=wait this.ormManager.findOne({
其中:{id},
})
将t作为承诺返回//此处
}
...
}
在接口定义的中有id:number
,但在用户类中有id:string
。在接口定义中有id:number
,在用户类中有id:string
。
class UserRepository {
...
async createAndSave(data: ICreateUserDTO): Promise<User> {
...
}
async findById({ id }: { id: number }): Promise<User | null> {
const t = await this.ormManager.findOne({
where: { id },
})
return t as Promise<User> // here
}
...
}