考虑以下代码:
setContext(async (req, { headers }) => {
const token = await getToken(config.resources.gatewayApi.scopes)
const completeHeader = {
headers: {
...headers,
authorization:
token && token.accessToken ? `Bearer ${token.accessToken}` : '',
} as Express.Request,
}
console.log('accessToken: ', completeHeader.headers.authorization)
return completeHeader
})
哪个会产生以下TS错误:
“请求”类型上不存在“授权”属性。
这来自尝试访问completeHeader.headers.authorization
。实际上,authorization
接口上没有属性Express.request
。奇怪的是TypeScript无法从文字对象推断类型,而文字对象显然是string
类型。如果未定义类型as Express.Request
,则任何不安全的分配都将引发错误。
是否需要为此字段创建一个新的TS接口?还是我们使用了错误的类型?字段authorization
看起来像是发送令牌的常用字段。
答案 0 :(得分:2)
completeHeader.headers
强制转换为Express.Request
类型。 强制类型将覆盖推断的类型。 您可以做的是,通过执行以下操作来扩展该强制类型:
as Express.Request & { authorization: string }
或者您可以创建一个全新的类型:
type AuthorizedRequest = Express.Request & { authorization: string };
...
as AuthorizedRequest