【发布时间】:2021-04-21 09:06:15
【问题描述】:
我正在尝试实现https://next-auth.js.org/configuration/callbacks#session-callback 的回调。 sesssion 回调定义如下:
export interface CallbacksOptions {
session?:
| ((session: Session) => WithAdditionalParams<Session>)
| ((session: Session, userOrToken: User | JWT) => Promise<WithAdditionalParams<Session>>);
}
session回调的实现:
async session(session: Session, token: JWT) {
if (token?.accessToken) {
session.user.accessToken = token.accessToken;
session.accessToken = token.accessToken as string;
}
if (token?.provider) {
session.user.provider = token.provider;
}
if (token?.accountId) {
session.user.accountId = token.accountId;
}
return Promise.resolve<WithAdditionalParams<Session>>(session);
}
编译器抱怨:
TS2345: Argument of type 'Session' is not assignable to parameter of type 'WithAdditionalParams<Session> | PromiseLike<WithAdditionalParams<Session>>'.
Type 'Session' is not assignable to type 'WithAdditionalParams<Session>'.
Type 'Session' is not assignable to type 'Record<string, unknown>'.
Index signature is missing in type 'Session'.
session 定义如下:
export interface Session {
user: WithAdditionalParams<User>;
accessToken?: string;
expires: string;
}
export type WithAdditionalParams<T extends Record<string, any>> = T & Record<string, unknown>;
export interface User {
name?: string | null;
email?: string | null;
image?: string | null;
}
我做错了什么? next-auth 的 repo 托管在 https://github.com/nextauthjs/next-auth 和类型 https://github.com/DefinitelyTyped/DefinitelyTyped/blob/7c785c26527720bf726f8b8bcbab2f96c600d1a4/types/next-auth/index.d.ts
【问题讨论】:
-
这里的问题是
Session是一个没有索引签名的接口,并且根据microsoft/TypeScript#15300,接口不会获得“隐式索引签名”。因此,您不能只使用Session编译器期望Session & Record<string, unknown>,因为前者没有索引签名而后者有一个。您可以使用type assertion 使其工作,例如this。这对你有用吗? -
如果这能解决您的问题,我会写一个答案;如果没有,你能详细说明我缺少什么吗?
-
哇......就像一个魅力。还有一个问题。什么是隐式索引签名?
-
当我有机会写下答案时,我会讨论这个问题,但基本上编译器有时会允许您通过“隐式”添加将没有索引签名的类型分配给有签名的类型前一种类型的索引签名。
标签: typescript