我正在尝试将以下 js 转换为打字稿,但在检查我的 account
对象时遇到问题,因为它未分配,因此代码无法构建:
const accounts = state.msalInstance.getAllAccounts(); let account; if (accounts.length) { account = accounts[0]; } else { await state.msalInstance .handleRedirectPromise() .then(redirectResponse => { if (redirectResponse !== null) { account = redirectResponse.account; } else { state.msalInstance.loginRedirect(); } }) .catch(error) => { console.error(`Error during authentication: ${error}`); }); } if (account) {}
上面的代码在js中工作正常,所以我已将其转换为以下ts,但现在最终的if
将无法编译,因为我试图在分配任何内容之前使用帐户变量:
const accounts = state.msalInstance.getAllAccounts(); let account: object; if (accounts.length) { account = accounts[0]; } else { await state.msalInstance .handleRedirectPromise() .then((redirectResponse: { account: object; }) => { if (redirectResponse !== null) { account = redirectResponse.account; } else { state.msalInstance.loginRedirect(); } }) .catch((error: { name: string; }) => { console.error(`Error during authentication: ${error}`); }); } if (account) { // this won't compile anymore as account isn't assigned }
如何更改 account
对象以便查看它是否为空或未定义?我尝试将其专门设置为 null,但它说我无法将对象设置为 null。
解决在赋值之前无法使用变量的问题的解决方案非常简单 - 只需为其赋值即可。
您可以明确其值最初是
未定义
,这就是已声明但未赋值的变量所发生的情况。或者您可以使用更有意的“无值”初始值,例如null
。当然,这会将您的变量类型更改为包含此初始值的联合,但这与您使用它的方式一致,因此我认为这不会成为问题。
顺便说一句,
object
并不是一个很好用的类型。如果您有 linting,您可能会收到警告。某种形式的记录
a> 对您来说更有用/更清晰?当你这样做时 ->
你告诉 Typescript 该帐户只能是一个
对象
,但是 Typescript 会让你延迟分配它,但是如果它检测到有可能永远不会将对象分配给帐户,它会给你 ->变量“account”在分配之前使用。
被视为您在进行真实测试 ->
if (account) {
逻辑上您的类型是
object
或undefined
在某些情况下,明确未设置的值可能更有意义,因此有些人也喜欢为此使用
null
->let account:object |空=空