AWS Amplify useAuthenticator类型定义与运行时实际不符问题咨询
AWS Amplify useAuthenticator 类型定义与运行时属性不一致的原因及解决方案
核心原因
抽象类型与具体实现的差异:
useAuthenticator返回的user类型是抽象的AmplifyUser,但运行时实际是Cognito的具体实现类CognitoUser。signInUserSession是CognitoUser特有的属性,未在抽象父类AmplifyUser的类型定义中声明,因此TypeScript编译时会报错,但运行时实例具备该属性。内部属性的类型隐藏:
CognitoIdToken的payload属性被TypeScript类型定义标记为内部属性,官方不推荐直接访问,因此类型检查会提示不存在该属性。官方设计了decodePayload()方法来安全获取解析后的payload内容。
解决方案
方案一:类型断言为具体实现类
通过类型断言将user转为CognitoUser,直接访问属性:
import { useAuthenticator } from "@aws-amplify/ui-react"; import { CognitoUser } from "amazon-cognito-identity-js"; const { user } = useAuthenticator((context) => [context.user]); // 断言为CognitoUser实例 const cognitoUser = user as CognitoUser; const userGroup = cognitoUser.signInUserSession?.idToken.payload['cognito:groups'];
注意:需确保当前
user确实是CognitoUser实例(如仅在已登录状态下使用),避免类型断言错误。
方案二:使用官方推荐的方法获取Payload
遵循类型定义,用decodePayload()方法获取解析后的payload:
import { useAuthenticator } from "@aws-amplify/ui-react"; const { user } = useAuthenticator((context) => [context.user]); const idToken = user.getSignInUserSession()?.getIdToken(); const payload = idToken?.decodePayload(); const userGroup = payload?.['cognito:groups'];
这种方式完全符合TypeScript类型检查要求,无需绕过类型定义,更安全可靠。
内容的提问来源于stack exchange,提问作者Lacrosse343
相关产品推荐
相关产品推荐

