【问题标题】:Type 'Promise<UserDomain>[]' is not assignable to type 'UserrDomain[]'类型 'Promise<UserDomain>[]' 不可分配给类型 'UserrDomain[]'
【发布时间】:2020-10-14 11:16:13
【问题描述】:

我被困在async地狱:

function convertToDomainUsers(dbUsers: Array<UserDB>): Array<UserDomain> {

  // iterate each DB user and convert them to domain user types
  const domainUsers: Array<UserDomain> = dbUsers.map( async (dbUser: UserDB) => {

    // first convert the DB user to a Domain User
    const domainUser: UserDomain = newUserDomainModel(dbUser);

    // Now we need to get their user links from the DB
    const dbUserLinks: Array<UserLinkDB> = await findDBUserLinks(dbUser.user_id);

    // convert their user links to Domain user links
    const domainUserLinks: Array<UserLinkDomain> = convertToUserLinks(dbUserLinks);

    // now merry up the domain user links to the domain user  
    domainUser.links = domainUserLinks;

    return domainUser;
  });

  return domainUsers;
}

function newUserDomainModel(user: UserDB): UserDomain {
  const domainUser: UserDomain = {
    username: user.user_username,
    firstName: user.user_name_first,
    lastName: user.user_name_last
  };
    
  return domainUser;
}

async function findDBUserLinks(userId: bigint): Promise<Array<UserLinkDB>> {
  const dbUserLinks: Array<UserLinkDB> = await getUserLinks(userId);
  return dbUserLinks;
}

async function getUserLinks(id: bigint): Promise<Array<UserLinkDB>> {
  setDB();
  await client.connect();

  const query = `
    select 
      link_url,
      social_type_id
    from user_links
    WHERE user_id = ${id}`;

  const res = await client.query(query);
  const links: Array<UserLinkDB> = res.rows;

  return Promise.resolve(links);
}

错误(发生在convertToDomainUsers 函数中的const domainUsers:):

TS2322: Type 'Promise<UserDomain>[]' is not assignable to type 'UserDomain[]'.   Type 'Promise<UserDomain>' is missing the following properties from type 'UserDomain': username, firstName, lastName, fullName, and 6 more

添加 cmets 是为了使此堆栈帖子更易于理解。我通常不写 cmets,它们很笨拙。

【问题讨论】:

  • UserrDomain 在“用户”的末尾有 2 个“r”是一个错误吗?我不知道这是否是实际问题,但它似乎是错误的。
  • @zero298 实际上是Array&lt;Promise&lt;UserDomain&gt;&gt;,它是一个承诺数组,而不是一个数组的承诺。
  • 这仍然比嵌套 6 深的 .then() 回调要少得多。
  • @PositiveGuy 是的,回调是异步的,这就是使它成为一系列承诺的原因。参见例如stackoverflow.com/q/40140149/3001761,你不能只是等待数组 .map 返回。
  • await Promise.all(dbUsers.map(...) 我认为应该这样做

标签: javascript node.js asynchronous


【解决方案1】:

来电:

const domainUsers = await Promise.all(convertToDomainUsers(dbUsers));

工作实施:

function convertToDomainUsers(dbUsers: Array<UserDB>): Array<Promise<UserDomain>> {

  const domainUsers: Array<Promise<UserDomain>> = dbUsers.map( async (dbUser: UserDB) => {

    const domainUser: UserDomain = newUserDomainModel(dbUser);

    const dbUserLinks: Array<UserLinkDB> = await findDBUserLinks(dbUser.user_id);

    const domainUserLinks: Array<UserLinkDomain> = convertToUserLinks(dbUserLinks);

    domainUser.links = domainUserLinks;

    return domainUser;
  });

  return domainUsers;
}

【讨论】:

  • 同样,它返回一个承诺数组不是一个数组的承诺。如果它返回了一个承诺 Promise.all 将无法使用它。这甚至是您声明的domainUsers,但不是返回类型;这不会通过类型检查。
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 2021-11-05
  • 1970-01-01
相关资源
最近更新 更多