TypeScript-使用HOC验证对象属性

时间:2019-09-05 06:49:54

标签: typescript graphql

我有一个如下所示的上下文接口:

export interface IReq extends Request {
  user?: IUser;
}

export interface IContext {
  req: IReq;
  res: Response;
}

我有一个isAuthenticated HOC,可以包装左轮手枪:

import { IContext } from "generic";

export default (next: Function) => <R, A, I>(root: R, args: A, context: IContext, info: I) => {
    if (!context.req.user) {
        throw new Error(`Unauthenticated!`);
    }

    return next(root, args, context, info);
};

该函数检查以确保用户可用,否则,将引发错误。

当我将解析器包装在HOC中时,TypeScript仍然抱怨context.req.user可能未定义。

import isAuthenticated from '../../utils/isAuthenticated';

export default {
    Add: isAuthenticated((
      _: null,
      { input }: { input: AddInput },
      context: IContext
    ) => {
        return Controller.add({ ...input }, context.req.user);
    })
};

context.req.user不能是未定义的,因为isAuthenticated HOC甚至在调用子函数之前都会抛出错误。

有没有更好的方法来构造它?

1 个答案:

答案 0 :(得分:0)

打字稿编译器只能这么聪明。

如果您是超级骗子,请根据自己的应用程序逻辑确保该值不能为nullundefined,然后可以通过在您的末尾添加!来告诉Typescript表达。

人为的例子:

let foo: string | null = null
function setFoo() { foo = 'a,b,c' }
setFoo()
console.log(foo!.split(','))
//             ^ here

或您的情况:

context.req.user!

但是请谨慎使用,因为如果您输入错了,并且那里可能存在null,则可能会引发异常。