是的,我知道接口在运行时不存在。我创建了这个解决方案,它验证我的输入并在我需要时给我输入错误。我认为我的标题有点误导,所以我还将标题更改为“使用 Typescript 自动验证请求的最佳方法是什么”。
这个想法是强迫我为我希望用来验证后端端点的每个接口编写一个简单的模式。此外,为了尽量减少人为错误的可能性,我的 linter 类型检查 validatorObject 很重要。
validateParams.ts:
const validateParams: (targetObject: any, validatorObject: any) => boolean = (targetObject, validatorObject) => {
if (typeof targetObject !== typeof validatorObject) return false
if (typeof targetObject === 'object') {
let validObject = true
if (Array.isArray(targetObject)) {
for (let subObject of targetObject) {
validObject = validObject && validateParams(subObject, validatorObject[0])
}
} else {
for (let key of Object.keys(validatorObject)) {
if (typeof targetObject[key] === 'object') validObject = validObject && validateParams(targetObject[key], validatorObject[key])
if (typeof targetObject[key] !== typeof validatorObject[key]) validObject = false
}
}
return validObject
}
return true
}
export default validateParams
认证.ts
import { Request, Response } from 'express'
import validateParams from "./validateParams"
interface AuthenticateParams {
email: string
password: string
}
const validatorObject: AuthenticateParams = {
email: 'string',
password: 'string'
}
type AuthenticationRequest = Request & {body: AuthenticateParams}
const authenticate = async (req: AuthenticationRequest, res: Response) => {
if (!validateParams(req.body, validatorObject)) res.status(400).send('Invalid body')
// DO STUFF
let stuff
res.status(200).send(stuff)
}
export default authenticate
updateUser.ts
import { Request, Response } from 'express'
import validateParams from "./validateParams"
interface UpdateUserParams {
name: string
products: {
name: string
price: number
}[]
}
const validatorObject: UpdateUserParams = {
name: 'string',
products: [{name: 'string', number: 0}]
}
type AuthenticationRequest = Request & {body: UpdateUserParams}
const updateUser = async (req: UpdateUserParams, res: Response) => {
if (!validateParams(req.body, validatorObject)) res.status(400).send('Invalid body')
// DO STUFF
let stuff
res.status(200).send(stuff)
}
export default updateUser
这不是最漂亮的解决方案,但我喜欢它自动验证我的请求并且如果我忘记更新我的验证器对象也会给我错误。但是,是的,在运行时获得 Typescript 接口会很棒。