我的代码实际上工作正常,但我收到了一个Typescript警告,说我不明白。
const dashboardStore = useDashboardStore()
dashboardStore.$subscribe((mutation) => {
// This works OK!
console.log(mutation.payload.id)
})
PhpStorm在mutation.payload
上给了我一个警告:
TS2339:类型“SubscriptionCallbackMutation”上不存在属性“payload”。 属性“payload”不存在于
它正确地推断回调本身是一个Pinia SubscriptionCallback<DashboardState>
。
Pinia类型将mutation
参数显示为SubscriptionCallbackMutation<S>
类型,并声明该类型为:
export declare type SubscriptionCallbackMutation<S> = SubscriptionCallbackMutationDirect | SubscriptionCallbackMutationPatchObject<S> | SubscriptionCallbackMutationPatchFunction;
当然,类型SubscriptionCallbackMutationPatchObject
具有我需要的patch
属性。
所以如果我显式地键入回调参数...
dashboardStore.$subscribe((mutation: SubscriptionCallbackMutation<DashboardState>) => {
// No errors or warnings
const typedMutation = mutation as SubscriptionCallbackMutationPatchObject<DashboardState>
console.log(mutation.payload.id)
}
但是我不能将mutation
参数指定为SubscriptionCallbackMutationPatchObject<DashboardState>
,这让我感到困惑。
有人知道为什么吗?我怎么能做到这一点,而不需要重新打字?
1条答案
按热度按时间lxkprmvk1#
根据声明,我意识到Pinia的类型是明确的
SubscriptionCallbackMutation<S>
:...但这并不能保证它是
SubscriptionCallbackMutationPatchObject<S>
,因此不会有payload
属性。我来核实一下。因此,我可以显式地键入
mutation
参数到SubscriptionCallbackMutation<DashboardState>
,然后只签入方法调用,如下所示: