当前位置: 首页 > 知识库问答 >
问题:

如果我想返回对象,函数返回类型

谷梁鸣
2023-03-14

注意:请通读后再回答。这看起来是一个简单的问题,但我不确定它是否如此简单。另外,我是打字新手,所以对我宽容点

所以这是用例。我有一个模型用户,我编写了一个通用函数来根据数据库中的电子邮件检查用户是否存在。如果存在,则返回用户对象。

现在,如果它是任何其他对象,那么我可以定义类型并继续我的代码,但它是我从DB得到的用户对象,不知道如何解决这个问题。

我通过提到返回类型“any”找到了解决方法,但我的灵魂并不平静。这感觉更像是一个黑客而不是解决方案。

说得够多了,这是代码

export const existingUser = async (email: string): Promise<any> => {
  const foundUser = await User.findOne({ email: email });
  return foundUser;
};

正如我上面提到的,这是可行的,但是我尝试了一种不同的方式,那就是抛出错误。我已经定义了如下所示的用户模型类型:

export interface Iuser extends Document {
  profile_picture_url?: string;
  first_name: string;
  last_name: string;
  email: string;
  password: string;
  phone_number?: string;
  is_agree_terms_at: string;
  gender?: Gender;
  role: UserRole;
  isValid: boolean;
}

然后提到 Iuser 作为我的返回类型,因为这是我期望从 DB 获得的对象类型。我知道一旦添加到数据库中,它将有其他字段,但我不知道更好 -_-

export const existingUser = async (email: string): Promise<Iuser> => {
  const foundUser = await User.findOne({ email: email });
  return foundUser;
};

请帮助我。我睡不着。

共有1个答案

常宸
2023-03-14

第一个问题-您的函数是< code>async,它返回一个promise,因此您需要将< code>Iuser包装在一个promise类型中-

// NOTE: This code doesn't work just yet, there are more issues
export const existingUser = async (email: string): Promise<Iuser> => {
  const foundUser = await User.findOne({ email: email });
  return foundUser;
};

第二个也是主要问题-如果您检查. findOne的返回类型-您会注意到它返回一个联合类型-它找到的文档或null(以防您的查询不匹配任何内容)。

这意味着finuser的类型实际上是Iuser|null,但您将其视为Iuser-这是不兼容的。

你能做的反而是-

export const existingUser = async (email: string): Promise<Iuser | null> => {
  const foundUser = await User.findOne({ email: email });
  return foundUser;
};

这也将返回Iuser|null

或者如果你100%确定用户一定存在-

export const existingUser = async (email: string): Promise<Iuser> => {
  const foundUser = await User.findOne({ email: email });
  return foundUser!;
};

运算符断言类型不为空。

或者,如果您想在找不到用户时抛出异常-

export const existingUser = async (email: string): Promise<Iuser> => {
  const foundUser = await User.findOne({ email: email });
  if (!foundUser) {
      throw new Error('User not found');
  }
  return foundUser;
};

查看使用mongoose和typescript,以获得关于如何将Iuser类型直接烘焙到mongoos模型中的一般理解-这将使类型系统在本例中为您完成所有类型推断工作。

 类似资料:
  • Android Kotlin,<代码>api。openOrder返回类型为BaseResponse 我想要的代码是,如果配置文件。值不为null,API返回BaseResponse 但android studio提示,这种有趣的返回类型是任何,如何修复? 排除if-else用法,因为配置文件。值具有许多属性,并且具有配置文件。价值用户名,

  • 我得到了这个错误:这个表达式的类型是'void',所以它的值不能被使用。尝试检查是否使用了正确的API;可能会有一个函数或调用返回您意想不到的void。还要检查类型参数和变量,它们也可能是空的。 代码: null null 我不明白这是什么。我是新手。这是我的第一个应用程序。有人能帮我一下吗。

  • 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回

  • 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回

  • 我找到了一些很好的SO链接(如何从异步回调函数返回值?以及从node.js中的回调函数返回值等),但它们并不是不能为我的问题提供解决方案。 我的问题:能够得到异步调用的结果,但我如何使用这个结果返回我的函数? 这里获取callBackResponse的值为true或false,并希望将该值用作:

  • 问题内容: 我正在制作一个应用,该应用使用Volley Networking Library for Android从URL获取a 并从其中检索JSON数据。 AppController.java MainActivity.class中的方法 它给出以下错误: 我该如何纠正此代码? 问题答案: 您需要扩展Application类而不是AppCompatActivity类。 并记住也要更新清单。即。