我有一个如下所示的上下文接口:
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甚至在调用子函数之前都会抛出错误。
有没有更好的方法来构造它?
答案 0 :(得分:0)
打字稿编译器只能这么聪明。
如果您是超级骗子,请根据自己的应用程序逻辑确保该值不能为null
或undefined
,然后可以通过在您的末尾添加!
来告诉Typescript表达。
人为的例子:
let foo: string | null = null
function setFoo() { foo = 'a,b,c' }
setFoo()
console.log(foo!.split(','))
// ^ here
或您的情况:
context.req.user!
但是请谨慎使用,因为如果您输入错了,并且那里可能存在null,则可能会引发异常。