Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正确使用typescript泛型_Javascript_Node.js_Typescript - Fatal编程技术网

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
      }

    ...
}