【问题标题】:How to check object type from request.body in Typescript?如何从 Typescript 中的 request.body 检查对象类型?
【发布时间】:2021-08-31 11:39:55
【问题描述】:

我需要从请求正文中检查对象类型,然后根据该类型运行适当的函数,我尝试这样做:

export interface SomeBodyType {
    id: string,
    name: string,
    [etc....]
}

export const someFunction = async (req: Request, res: Response) => {
    const { body } = req.body;

    if (body instanceof SomeBodyType) {
        //run function A
    } else {
        // run function B
    }
}

但它不起作用,导致我的SomeBodyType 向我返回错误:only refers to a type, but is being used as a value here.

那么,在这种情况下,我如何检查body 的类型?

感谢您的帮助!

//// 编辑:

感谢@phn 的回答,我创建了这个通用函数来检查对象类型:

export const checkObjectType = <T>(body: T): boolean => {
    return (body as T) !== undefined;
}

如果这个功能好,请看看并评论

【问题讨论】:

  • 您不能为此使用接口,类型在运行时不存在

标签: javascript typescript if-statement types


【解决方案1】:

如 cmets 中所述,运行时中不存在类型。

您需要编写一个函数来验证正文中收到的内容,一种方法是来自TypeScript documentation(参见代码示例)。

更高级和动态的方法是使用验证库根据架构或合同验证您的输入,例如 ajv

interface SomeBodyType {
  id: string,
  name: string
}

function isBodyType(body: any): body is SomeBodyType {
  return (body as SomeBodyType).id !== undefined &&
    (body as SomeBodyType).name !== undefined;
}

export const someFunction = (req: Request, res: Response) => {
  const { body } = { body: { id: '', name: '' } };

  if (isBodyType(body)) {
    // run function A
  } else {
    // run function B
  }
};

【讨论】:

  • 嗨,在这个例子中pet is Fish 是什么?
  • 你能看看我在主帖下方的通用函数吗?
  • 它被称为类型谓词,另请参阅我链接的文档以获得更深入的解释。当您的对象变得更复杂时,我会推荐架构验证方法。理想情况下,您需要验证每个属性以确保它是有效的输入。
  • 为了您的方便,我更新了答案。
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 2018-08-26
  • 2020-11-01
  • 2011-01-27
  • 2019-07-05
  • 2012-09-29
  • 2010-11-24
相关资源
最近更新 更多