typescript 为什么类型(()=>string)会突然出现?

fjnneemd  于 2022-11-18  发布在  TypeScript
关注(0)|答案(1)|浏览(205)

我正在使用 jasonwebtoken 包。我发现了这个新的javascript/typescript行为。

interface JwtPayload {
    [key: string]: any;
    iss?: string | undefined;
    sub?: string | undefined;
    aud?: string | string[] | undefined;
    exp?: number | undefined;
    nbf?: number | undefined;
    iat?: number | undefined;
    jti?: string | undefined;
}
let payload: JwtPayload | string
let id: string | undefined

id = payload.sub

在作业中我得到了错误。这是怎么回事?

Type 'string | (() => string) | undefined' is not assignable to type 'string | undefined'.
Type '() => string' is not assignable to type 'string'.(2322)

TSPlayground

euoag5mw

euoag5mw1#

您已经将payload声明为JwtPayload * 或 * 字符串:

let payload: JwtPayload | string

这意味着payload.sub既可以表示JwtPayloadsub属性 *,也可以表示stringsub属性 *。
原来字符串上的sub存在:它是String.prototype.sub()方法,它的类型是() => string,所以它不是凭空而来的.
要将payload.sub赋值给id,需要确保payload不是字符串:

if (typeof payload !== 'string') {
    id = payload.sub;
}

这样,编译器就可以安全地确定它是JwtPayload,这意味着payload.sub具有所需的类型。
您也可以Assertpayload具有您假定的类型,但这只是意味着告诉编译器不要再谈论类型安全,这意味着您需要祈祷它不会在运行时给予错误。

相关问题