类型“string”不可分配给类型“SessionStrategy |” 不明确的'

689*_*uge 0 typescript next-auth

我在下一个项目中使用 next-auth 进行授权并使用打字稿,当我将“jwt”分配给策略时,会出现类型错误警告:类型“string”不可分配给类型“SessionStrategy |” 不明确的'。

我的代码:

  session: {
    strategy: 'jwt',
  },
Run Code Online (Sandbox Code Playgroud)

类型代码:这些类型都是官方类型,没有自己声明

export interface NextAuthOptions {
...
session?: Partial<SessionOptions>;
...
}
Run Code Online (Sandbox Code Playgroud)
type Partial<T> = { [P in keyof T]?: T[P] | undefined; }
Run Code Online (Sandbox Code Playgroud)
export interface SessionOptions {
...
strategy: SessionStrategy;
...
}
Run Code Online (Sandbox Code Playgroud)
export declare type SessionStrategy = "jwt" | "database";
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

eri*_*2k8 13

太长了;

向选项对象添加类型:

export const authOptions: NextAuthOptions = {
Run Code Online (Sandbox Code Playgroud)

解释:

想象一下你有一个函数:

type GreetOptions = {
  greeting: 'hello' | 'hey'
  name: string
}

const greet = ({ greeting, name }: GreetOptions) => {
  console.log(`${greeting}, ${name}!`)
}
Run Code Online (Sandbox Code Playgroud)

您可以直接调用它,例如:

greet({ greeting: 'hello', name: 'Joe' })
Run Code Online (Sandbox Code Playgroud)

但是如果你将对象提取到变量中,它就会失败......

const options = { greeting: 'hello', name: 'Joe' }

// ERROR! Type 'string' is not assignable to type '"hello" | "hey"'.(2345)
greet(options)
Run Code Online (Sandbox Code Playgroud)

编译器按照执行顺序读取代码。所以它首先遇到options变量。它不会提前阅读代码来尝试弄清楚你将用它做什么,它只是推断出一个合理的类型:

const options: {
  greeting: string;
  name: string;
}
Run Code Online (Sandbox Code Playgroud)

然后,当您尝试将其传递给 时greetstringfor 的类型greeting不够具体,无法匹配参数类型。但是,您可以帮助它并声明它应该是什么:

const options: GreetOptions = { greeting: 'hello', name: 'Joe' }
Run Code Online (Sandbox Code Playgroud)

现在它可以检查它并确保您不这样做:

const options: GreetOptions = { greeting: 'goodbye', name: 'Joe' }
Run Code Online (Sandbox Code Playgroud)